Introduce Finalizers to avoid cycles

As per #8, there was a leak due to cycles and the definition of a
`__del__` destructor. This instead uses weak proxies to be notified of 
deletion and invoke the correct destructor.

A new type, `_BaseFinalizer` is introduced, where one can override the 
destruction behaviour by defining `destructor`.