Modular encoding

Restructured Backends to make CF conventions handling consistent.

Among other things this includes:
- EncodedDataStores which can wrap other stores and allow
  for modular encoding/decoding.
- Trivial indices ds['x'] = ('x', np.arange(10)) are no longer
  stored on disk and are only created when accessed.
- AbstractDataStore API change.  Shouldn't effect external users.
- missing_value attributes now function like _FillValue

All current tests are passing (though it could use more new ones).
you're right, I was thinking of slice objects.

on the other hand, if you only need ndarray-like variants of `range(N)`, you could just use `np.arange(len(self.array))` instead. (python3 supports slicing range objects, but that's not an option we have here)