Optimizer wasn't deleting unused procedure-valued bindings if the
procedure had side-effects. The bug fix to make top-level failure
continuations do backtracking prevented them from being substituted
properly; the substitution predicate was extended to allow this.
Also, some valuable substitutions weren't being seen because the
optimizers were being run in a fixed order. After the peephole
optimization is done, it reveals more possibilities for substitution.
So now the optimizers are re-run until nothing more can be done.