stuff the join dependency object in the "anything goes" hash.
merge JoinDependency as outer joins

Merge JoinDependency objects as outer joins
delete unused code

Now that we merge trees from the top down, we don't need to search
through the whole tree for particular nodes, just walk it and merge.
nodes do not need to be sorted
pass the parent node to the construct method
the parent node is on the stack, so use it

we don't need to walk back up the node's parents when we have the parent
on the stack
refactor a little so we can remove some methods