This is another big cleanup/rewrite of the BranchCollector. The main impetus for this was a problem in how let's were being handled. This revision stores the branches from a let variable in a scope, which can then be retrieved later when the variable is encountered. I've also refined the visiting pattern a bit by moving the essential logic of branch_children into a merge_child_branches function, and then handling the rest of the functionality of branch children explicitly in each visit method. This is slightly closer to what this visitor might look like if it were to get rewritten using the IRMultiMutator class in the multi-mutator branch. This commit drastically increases the compile times when dealing with lots of lets, as in the case of the cascaded_filters test. However, in its current state it leads to combinatorial explosion problems when dealing with highly nested selects. I am currently investigating a fix for this.