Object Versioning: explicit versions

current state can be explicitly commited as a version instead of
creating a version on every change

creating a new version copies the current OT, sets that as new current OT,
announces that new OT as version, and freezes all objects in that OT.
setting a property on any object therefore checks whether the object
is frozen, then clones it and writes the new clone to the new OT if so.