Use method swizzling and dynamic subclassing instead of associative objects

There were some obscure bugs being caused by the fact that associative
objects are released after the owning object is already deallocated.
This caused a need for some weird hacks including modifying the dealloc
of NSObject. This change gets rid of the need for associate objects by
instead using a central repository for all bindings. It also dynamically
modifies objects instead of modifying the NSObject class.