Decouple deserialization logic from data storage

This rewrites data models to contain the actual data fields (with the
python types we want to handle), and a special '_fields' variable which
contains the name of the field, the appropriate serializer, and an
optional default value used when instantiating the data model.

To avoid code duplication, only the _fields variable is defined, not the
actual fields; they are created by the superclass on instantiation.