Object Versioning: proxy handler knows versions - no global OT

instead of proxies only storing an object ID that can be resolved to
the correct version of an object using the correct version of a global
object table, proxies now store all versions of their targets and dynamically
choose the correct version using a global version (lively.CurrentVersion).

this way, we don't rely on objectIDs and global object tables anymore and also
have proper garbage collection: when a proxy becomes unreachable all versions of
the target would also become unreachable (and would eventually be GCed instead
of still being referenced by a global object table). all objects of previous versions should however still be reachable as
1. we don't intend to allow changing previous versions
2. our proxies refer to all previous versions of their targets, which allows to transitively get to all objects of any version... always starting from either a given proxy or from ordinary JavaScript objects that refer to proxies (versioning roots are, for example, currently the modules, which refer to proxies for all their classes...)

to still have lively.proxyFor(obj) === lively.proxyFor(obj), we use a WeakMap to
link objects to their proxies (lively.ProxyTable)..