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 slices with step-sizes of 1 are supported.

Slices return `DistArray` views as one would expect.

This required a small bit of refactoring
1. I added a couple small attributes to `NoDistMap`s from `BlockMap`s for convenience
2. I consolidated two separated implementations of `sanitize_indices` and expanded its functionality and usage.

Slicing currently throws errors when a resulting slice would have a dimension of size 0, but maybe Kurt's upcoming changes will resolve this.
It seems like this error case should be dealt with immediately after the `santitize_indices()` call -- reason for handling it here?