Initial implementation

This is a basic implementation of the ideas we discussed before about automatically validating database constraints. 

First of all, this gem includes 3 validators:

- `NotNullValidator`: checks whether the value is anything but `nil`. This is different from the standard `PresenceValidator`, because that one also errors on empty strings. `NotNullValidator` matches the NOT NULL database constraints exactly.
- `BytesizeValidator`: checks whether a string/blob is not larger than a given `:maximum` in bytes. The LengthValidator will check for characters, which doesn't work for TEXT and BLOB fields.
- `BasicMultilingualPlaneValidator`: checks whether all characters in a string are from the basic multilingual plane, i.e. fit in 3 UTF-8 bytes.

You can instantiate these by hand if you wish:

``` ruby
   validates :required, not_null: true
   validates :string, basic_multilingual_plane: true
   validates :blob, bytesize: { maximum: 65535 }
```

But next to these validators, it also adds a `DatabaseConstraintsValidator`, which generates a bunch of sub-validators based on the schema.
- For NOT NULL fields, it can add a NotNullValidator.
- For textual and binary blob fields, it can add a BytesizeValidator (TEXT and BLOB fields) or a LengthValidator (VARCHAR fields).
- For textual fields that have a `utf8mb3` collation, it can add a `BasicMultilingualPlaneValidator`.

By default, it will only generate size validators, unless you specify you want other validators as well.

``` ruby
  validates :string, database_constraints: true # adds just a size validator
  # or, specify you want everything:
  validates :required_string, database_constraints: { constraints: [:not_null, :size, 
:basic_multilingual_plane] }
  # or, specify you want everything available:
  validates :required_string, database_constraints: { constraints: :all }

```

One thing to note is that the validators are created lazily, i.e. the first time a record is validated. This prevents leading the schema of the table at boot time.

@fw42 @byroot @jduff for review.
can you explain this?