Remove call to mpi.world collective operation at module import

this was causing hangs.
Add a MPIContext class
Add engine_utils.py
Add mpionly_utils.py
Import MPIContext at distarray.dist.MPIContext
create the engine app
Add global vars to distarray/__init__.py for managing MPI comms
Refactor context.py. Add BaseContext super class to reduce duplication
Add dummy MPIContext.delete_key, this was causing segfaults.
Add builtin function calls to MPIContext.apply
Add function for testing if run mode is ipython or mpi
Unify ipython and mpi context interface.

This is done by checking if the running program has mpi.comm_world.size
== 1 when it is run. This is case with IPython. With MPI, mpi.comm_world
size == nengines + 1
Fix MPIContext bug preventing multiple contexts.
Allow ContextTestCase to work with MPIContext.
Don't use xrange for targets because it doesn't support slices.
Fix bug int MPIContext._pull
Fix bug on engine side of Context._pull function.
Add tests for MPIContext
Fix bug in _push/pull/execute0 functions.
MPIContext._pull0 now returns the desired object, not in a list.