It holds necessary state plus additional information relative to the
context which we are being run to (e.g. if we are in a terminal or not).
Besides in the future we can use it also as a contextual logger to
provide more smart logging capabilities.
This also replace the general global configuration instance that
previously was share between the core components.
In this way, finalizer in strict environment can override the default
shell used to run commands.
The shell keyword is a list, as it needs to contain the full command +
args.