Remove `name` field from `Property` class in prep for Array Schema

* Properties don't need names by default
  * HashSchema uses them because the object is a key-value store
  * ArraySchema does not use property names because there are only two
    types of definitions for an array:
    * single-type: every item in the array has the same type
    * tuple: the order of the items matter, and each item can have a
      different property definition.
  * Arrays are an index-based data store, no need for human-readable
    names
Additional Params can now be passed to class initializer via `define`

* Provides a cleaner syntax for setting schema-level properties like
  strict mode or item uniqueness in arrays
Created Integer Property

* Very strict, does not accept strings of integers or floats
* Will parse Bignums and Fixnums correctly
* Gracefully fails if other data types are provided.
Created ArraySchema, used to validate single-type arrays and tuples

* There are two data structures commonly referred to as "arrays":
  * Single-type Arrays: an unordered list where every value is of the
    same type
  * Tuples: An ordered list of values, where each element can have a
    different type. Tuples have required and optional items
* There are separate definition methods for each:
  * Single-type: `schema.integer` (defines an integer array)
  * Tuples: `schema.items { |x| x.integer ; x.string}`
* Each one has a separate validation process
* The Array Schema can only be one of these types
* Errors are returned in a key-value pair, though only the "base"
  key will be populated with an array of error messages.
  * This is to keep the error-reporting consistent between schemas
* A minimum/maximum size can be defined for an array schema
* Array Schemas can validate that the array's items are unique
* Array Schemas can also allow `nil` objects to be considered valid
Use options hash in HashSchema initialization, add `allow_nil` option

* Schema-level options ("strict mode", etc.) are now set through an
  options hash during initialization
* supported `allow_nil` option for HashSchema, which allows `nil`
  objects to be considered valid.