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).
How about making the signature closer to a Dataset, like this:
```
def __init__(self, variables=None, attributes=None):
    ...
```

It's pretty straightforward to use dict unpacking if you want to pass in a dict_store object like you're currently doing.