Learning to read... (Allow properties to be marked as read-only)

This is some more precursor work to the value generation changes. It allows properties to be marked as read-only in metadata, meaning that an exception is thrown if a change to one of these properties is detected and that marking the entity as modified does not mark these properties as modified. Key properties are forced to be read-only.