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.
That change (unhook) was already implemented.

The joys of thunks - you simply don't know what they contain.