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.
if you `--report html` then you can open the coverage page once, do `npm run cover` then hit f5