Migrate away from models.Model and to an extended base class

@jamalex can you take a look at this?

* We've basically defined an abstract base class for all Django models in our app to use, which contains a few convenience functions (including get_or_initialize)
* I've also changed the interface of get_or_initialize, to follow the model of get_or_save.

Testing:
* I did try out registration / syncing, to make sure this didn't affect anything obvious.  There was no problem between servers of the same version, nor did I see any problem on syncing to previous versions.
* Tested out exercise saving, to make sure the new get_or_initialize works.  Found a bug (missing import), fixed, looking good.