Soft hooks

Implementation of soft hooks with unhook. Based on pull request from @Raynos. unhook is parallel to widget destruction, so that state can be cleaned up from stateful hooks. 

Global hooks are a performance hit. It seemed like a good idea to always enforce the value of a hook, but in practice it isn't really needed.

Primary use case for the unhook feature is understanding which events are being being listened to and only listening on those events which have event listeners in vdom tree. This will also allow us to remove events from recycled nodes.
We need to change `vNode.descendantHooks` to only be a thing if the hook IMPLEMENTS `unhook`.

We also need to figure out how to make `vnode.hasThunks` cheaper.