Ensure `column_types` returns a type object, and not a column
Remove YAML serialization workaround for columns

We are no longer including column objects in YAML serialization, thanks
to https://github.com/rails/rails/pull/15621
Merge pull request #15639 from sgrif/sg-column-serialization

Remove YAML serialization workaround for columns
Merge pull request #15638 from sgrif/sg-column-types

Ensure `column_types` returns a type object, and not a column
rm cached attributes

The original patch that added this concept can be found
[here](https://web.archive.org/web/20090601022739/http://dev.rubyonrails.org/ticket/9767).
The current default behavior is to cache everything except serialized
columns, unless the user specified otherwise. If anyone were to specify
otherwise, many types would actually be completely broken. Still, the
method is left in place with a deprecation warning in case anyone is
actually still calling this method.
Introduce an Attribute object to handle the type casting dance

There's a lot more that can be moved to these, but this felt like a good
place to introduce the object. Plans are:

- Remove all knowledge of type casting from the columns, beyond a
  reference to the cast_type
- Move type_cast_for_database to these objects
- Potentially make them mutable, introduce a state machine, and have
  dirty checking handled here as well
- Move `attribute`, `decorate_attribute`, and anything else that
  modifies types to mess with this object, not the columns hash
- Introduce a collection object to manage these, reduce allocations, and
  not require serializing the types