Refactored submodel so that a Model generates a declarative ModelSpec

Introduced specifications.py for defining declarative Specification
objects, including a new addition called ModelSpec. A Model is now a
class that generates a separate, declarative ModelSpec object.