Reorganized Library structure to support multiple schema types

* Each Schema is different, so they will require different ways of
  defining a schema and validating an object
* The base `Schema` class has been removed, each Schema will just
  include the modules it needs to define and validate the schema.
  * The code in the base `Schema` class has just been moved to the
    `HashSchema`, since it was essentially the same thing.
* The property lookup components of the `SchemaDefinition` module have
  been extracted into a separate `PropertyLookup` module