Slots

This implements issue #624: 
1. replacing _data with a strict dictionary (thus conserving memory spent on storing the keys on instance)
2. adding __slots__ to base document classes to conserver memory spent on dicts.

This drastically reduces the memory footprint when loading many instances of the same class.