convert hooks into soft hooks

This change converts all hooks into soft hooks.

Soft hooks only get called if the hook value has changed.

This removes weight and performance complexity from the virtual-dom
    implementation. If you want the hook to be invoked again you
    must create a new hook instance that is not referentially equal
    to the old hook.

cc @Matt-Esch
add a test for this