Add HDF5 IO, improve Flat-File IO, improve testing.py

In this PR, on top of #142, I add writing to and reading from HDF5 files and improve the API for saving and loading flat files.

Leveraging `h5py`'s ability to leverage a parallel build of HDF5, and leveraging our local maps, the `save_hdf5` function on `Context` can tell all the engines to write the indices they own to a *single* dataset in a *single* HDF5 file in parallel.  This HDF5 file doesn't have any special knowledge of `DistArray`s; I assume any application that can read HDF5 files can read it.

I also include a simple client-side `load_hdf5` function that uses `fromndarray`.  This is flexible, as we can then distribute the array however we like, but it's a serial read piped through the client.

I've put the `h5py` imports inside the `save...` and `load...` functions in the hopes that `h5py` can be an optional dependency.  The tests that need h5py should raise a `SkipTest` if h5py is not present.

Addresses #108.

Also, in this PR I improve the API for saving and loading flat files.  The engine-side `LocalArray` save and load functions are now fairly straightforward: they take a filename or a file-like object like NumPy's save and load functions.  The client-side save function now takes either a filename prefix (to which `_<comm_rank>.dnpy` is now appended on each engine) or a list of filenames, one per engine.

Along with this, I make some improvements and additions to `testing.py`.
1) Add a `more_tearDown` method to `MpiTestCase`
2) Add a `temp_filepath` function that generates a random filename inside a tempdir
3) Add an `import_or_skip` function that tries to import a module and if it doesn't exist it raises `unittest.SkipTest` (to make the h5py tests optional)

This PR is too long already; I'll make further improvements in new PRs.