Adds `get_base_comm()`

Previously there was no context-independent way to get the base communicator that encompasses all engines.  For IPython, this is equivalent to `COMM_WORLD`, but for an MPIContext that uses an intercommunicator, this is equivalent to the second intracommunicator that is created when an MPIContext is initialized.

Also removes unused functions and brings the `nengines` into the Context classes directly to remove `get_nengines()`.