simple synthesis of nops and single instructions

this pulls out some code that Raimondas and I have been collaborating on

the purpose of this code is to do simplistic but useful synthesis of RHSs. the two forms supported are:
- "nops" -- the optimized value turns out to have been available earlier, under a different name
- single instructions -- the optimized value is an extended, truncated, negated, or complemented version of a value that was available earlier

although I suspect this method of synthesis (which issues a lot of solver queries, and is therefore quite slow) will eventually not be the right way to go, we need this code in order to push forward improvements in the Pass

finally I should add that these kinds of synthesis work really well in the sense that they discover many potential replacements