Implement import and export for Distributed Array Protocol

Currently only implemented for distributed arrays containing only block-distributed and non-distributed dimensions.

In this PR:

1) Add a `__distarray__` method to `LocalArray` which exports the Distributed Array Protocol data structure
2) Add a `fromdap` function to `denselocalarray.py` to import an existing distributed array that supports the DAP
3) Add a decorator to `utils.py` that allows a test to "pass" if it has MPI.NULL_COMM as its communicator.  This allows tests to pass (rather than skip) when they're run with a greater number of MPI processes than they need.
4) Change uses of `buffer` in the code to use `memoryview`, and change uses of `np.frombuffer` to use `np.array`.
5) Add lots of DAP tests.