Intermediate Type instantiation

The code from my previous pull request is now "live" in the sense that the Types and TypeDefinitions can now be instantiated to create instances of the corresponding Value objects. There are also a large number of test cases added to this code, bringing code coverage up to 75% (we are still missing a few rudimentary tests on FooTypes, mostly equality tests, but nothing major that is stopping others from at least starting to look over this PR).