Allow global constants to be controlled by a context manager
This is so we can stop doing things like:
>>> old = cf.log_level('DEBUG') >>> <execute some code> >>> cf.log_level(old)
and start doing things like:
>>> with cf.log_level('DEBUG'): ... <execute some code> ... >>>
The core implementation is inherited from cfdm (NCAS-CMS/cfdm#100), which needs to be extended for the extra constants in extra cf-python