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.

There should be no untyped interfaces like this in core TS.