convert hooks into soft hooks

This implements soft hooks in a very aggressive destructive way.

cc @Matt-Esch 
What are the use cases for unhook? I've given a use case for recursive unhook. To me it seems preferable to have the strong assertions:

hooks are executed whenever they are created
hooks are executed whenever they are updated
hooks are executed whenever the are removed

^ that is simple from a reasoning perspective. Compare that with

hooks are executed when created
hooks are executed when updated
hooks are executed when removed if and only if they live on the parent node for that remove node patch.