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.
Yes that would fail. It is not a complete datetime. The motivation behind the comparison was to avoid casting ambiguous date formats like y/d/m. This might swing to far towards the strict end of the spectrum, but given the feedback so far around casting, people prefer it to be stricter.