first cut at supporting "nop synthesis" in the opt pass

Peter, could you check if this seems to be on the right track?

While building gzip using this + Raimondas's nop inference, I got an "Instruction does not dominate all uses!" so I know that there is something I've failed to take into account.

"nop inference" is what we have been calling the phenomenon when an LLVM value can be proven to be equal to some other value that was available earlier. It's a degenerate case of synthesis that I thought would be useful to handle in the opt pass before moving on to more interesting stuff.

Peter, I'm thinking that infer() should take a flag that causes it to only consider inputs that have at least one LLVM origin that dominates the origin of the value being optimized, does that seem reasonable?