BetterDict

This PR swaps out `DotDict` for `BetterDict`. 

We were having trouble [calling `deepcopy` on a `DotDict` in demands](https://github.com/yola/demands/blob/master/demands/__init__.py#L64) because `DotDict` mapped `getattr` to `dict.getitem`. When `deepcopy` gets called, it does a `getattr(x, '__deepcopy__')` on the object and the dict did not have that item.

`BetterDict` handles this case better and it works as a drop-in replacement.