Fix asymptotic performance issues in live variables analysis.

Fix possibly-exponential runtime for DFS graph searches.
Improve DFA fixpoint algorithm to correctly compute worklist
of only changed nodes for each iteration.

Added test that takes > 2 minutes to compile without these
improvements.
It seems this optimization (turning the `avoid` parameter into a local variable, which is a mutable hash set) is independent of the rest of this change set. If so, what's the performance improvement? The code is slightly longer and more imperative, so we might want to have a good reason to do it. What do people think?