Tree: Make node destruction a little less destructive.

Instead of setting various node properties to `null` when destroying a node,
set them to empty values. This makes it a little easier to figure out what
went wrong when you accidentally try to use a node after destroying it.
Tree: Better handling of destroyed nodes in createNode(), insertNode(), and traverseNode()

These methods will now throw (or log) informative error messages instead of
failing cryptically (or succeeding when they shouldn't) if you try to use them
with destroyed nodes.
Update Tree history.
Tree: Add tests to cover the case where an errorFn handles destroyed node errors.
Build tree.
Merge branch 'dev-master' into dev-3.x
Merge branch 'dev-master' into dev-3.x