Add `__getitem__` slicing

Add support for slicing (including incomplete indexing) through a `DistArray`'s `__getitem__`.  Currently only `BlockMap`s and `NoDistMap`s are supported and only step-sizes of 1 are supported.

These slices return `DistArray` views as one would expect.

This required a small bit of refactoring, and I added a couple small attributed to `NoDistMap`s from `BlockMap`s for convenience.