Implement multi-pass optimization: some of the variables might be avoided and inlined after the first pass
Fix https://github.com/julianhyde/linq4j/issues/17, "Assign constant expressions to 'static final' members".
Optimize a ? true/false : b and a ? b : true/false patterns coming from CASE
Optimize not expressions: !const, !!a, !(a==b), !(a!=b), !(a>b), etc