Convenience methods for retrieving template params

Also minor fixes to return types on pgrid_col / pgrid_row methods
Cleaner definitions of minimum local req'd storage

Also more conservative w.r.t. memory overhead - previous code only
allocated in increments of full block widths.
Convenience methods for minimum local storage dims
Corrected checks on non-zero local storage size
Semantics of commit() changed: no "frozen" state

There is no longer an internal "frozen" state for ConvergentMatrix,
previously entered following commit(). This means the user can freely
continue to run updates without assertion failures, the idea being that
a matrix can be constructed in multiple phases (with commit() being
called after each).

If enabled at compile time, consistency checks will be run at each call
to commit(). The replicated update cache is no longer deleted on calls
to commit(), and is simply zeroed in reset().

Other changes:
- drain_task_queue() no longer needed to wrap upcxx::drain() (long
  overdue to be removed)
Bugfix: In-place reduction of replicated updates

In-place reduction of replicated updates lost the local update history,
this causing consistency checks on later commit() calls to fail.
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
Bugfix: iostream also needed for MPI-IO (timing)