Added support for matrix save via MPI-IO

New save() method writes the distributed matrix to disk in native order.
At the moment, MPI must be initialized externally for this routine to
work. While this could be handled internally, it is currently better to
avoid assumptions about whether the MPI GASNet conduit is in use.

Also:
- minor cleanup for various MPI calls
- new private method for determining the base MPI type associated with
  the (templated) matrix data type