Make `_before_type_cast` actually be before type cast

- The following is now true for all types, all the time
  - `model.attribute_before_type_cast == given_value`
  - `model.attribute == model.save_and_reload.attribute`
  - `model.attribute == model.dup.attribute`
  - `model.attribute == YAML.load(YAML.dump(model)).attribute`
- Removes the remaining types implementing `type_cast_for_write`
- Simplifies the implementation of time zone aware attributes
- Brings tz aware attributes closer to being implemented as an attribute
  decorator
- Adds additional point of control for custom types
Couldn't we have just as easily gotten the wrong object passed to the constructor before? The plan is to promote this to an attribute decorator, so it needs to implement the full type interface. I'm not opposed to being more explicit, I'm just not sure I see the benefit, and I feel like it'd just add churn as the interface evolves.