Implement less aggressive casting in ORM.

This set of changes makes the type casting that occurs during marshaling to be far less aggressive. My aim is to solve the problems described in #4790, #4922 and others. By only casting data that is approximately the right type entities will have the opportunity to have invalid data which can then fail validation.

The most dramatic changes are in the date/time/datetime types as they now only cast string data that exactly matches the formats they use. Conversion from array forms is unaffected.
Maybe normalizing it prior to the check solves this.