Improved Support for Alternative Shells When Using rez-env.

Work on rez-env to improve support for tcsh (and other) shells.

* Split out the child shell related functionality into abstract base class.
* Implement concrete class for SH (based on previous implementation) and CSH.
* More logic could probably be abstracted from the current implementation into helper methods on the base class, but this is an ok start.
* Add option to override the shell 'language' currently being used.
* Also sanitise some imports.

I considered moving this functionality into rex.py (maybe even as part of the current shell interpreter implementations) to keep all language specific implementations together.  However, this functionality is conceptually different enough to rex that I don't think this really makes sense.  Instead, pluginising this code (and rex) will introduce the appropriate separation of concerns and cleaner implementation.

It is important to note that currently `system.shell` (and so the default shell language) will always be `bash` as rez-env is currently always run in a bash wrapper.  This needs resolving still, but adding a `--shell` argument to override this is a temporary compromise that achieves the desired result.