Move Test Classes into their own file, require in `test_helper`

* Test classes are useful across the entire test suite, especially
  when testing modules independently.
Handle block evals in `define` rather than Schema `initialize` method

* Perfectly encapsulates the expected behavior of `SchemaDefinition`,
  it is no longer required that classes implemented the module must
  include `yield self if block_given?` in the `initialize` method.
Make Property Definition Lookup methods Protected Methods

* No reason to expose them to outside users, they are only used
  internally by the `SchemaDefinition` module.
Reorganize tests to be reflective of what they are actually testing

* Tests for the Schema class and SchemaDefinition were intermixed,
  which makes it confusing to determine where behavior is defined.