Introduce an Attribute object to handle the type casting dance

Depends on #15429 and includes the changes from that PR as well. 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
Yes. Values that are not duplicable include fixnums and booleans...
On Jun 9, 2014 9:35 PM, "Eugene Gilburg" <notifications@github.com> wrote:

> In activerecord/lib/active_record/attribute.rb:
>
> > +
> > +    def type_cast
> > +      raise NotImplementedError
> > +    end
> > +
> > +    protected
> > +
> > +    def dup_value
> > +      if value.duplicable?
> > +        value.dup
> > +      else
> > +        value
> > +      end
> > +    end
> > +
> > +    def initialize_dup(other)
>
> so if value isn't duplicable, it'll create shallow reference. is this
> intended?
>
> —
> Reply to this email directly or view it on GitHub
> <https://github.com/rails/rails/pull/15593/files#r13576698>.
>