Read/write attribute directly from @attributes to match ActiveModel

This allows overridden getters/setters to be written like ActiveModel
getters/setters and call `read_attribute` and `write_attribute` to get
the raw value from the attributes hash. This previous behavior was
unexpected to users bring existing code from ActiveModel.

The other benefit of this change is that `ActiveModel::Dirty` can be
included and will actually behave properly since it overrides
`write_attribute`, expecting it to be called when a setter is called.

Signed-off-by: Evan Owen <kainosnoema@gmail.com>
Use un-overriden (but typecast) values when returning attributes hash

This more closely matches the behavior of ActiveRecord, further
reducing unexpected behavior for users familiar with AR.

Signed-off-by: Evan Owen <kainosnoema@gmail.com>