Add models API

This is an initial look at a refactored model API. There are some loose ends so I expect to iterate on this. Please use the PR mechanisms to comment on specific lines!

cc @AlexGKim @rcthomas @rbiswas4