Add core/SideTable

**SideTable** is a polyfill for WeakMap.

It is impossible to fully polyfill WeakMap (in particular you cannot provide `.clear()` and `.length`) so a functional alternative is useful.  It will use WeakMap when not present.

I would think some of the "private" queues for the Observation API could be moved over to SideTable as the WeakMap-like API is a lot cleaner and discourages end developers from trying to exploit "private" data and creating dependancies that may introduce breaking changes down the road.

Please do not play code golf.