Pushing selections
After correcting a bug with the pattern matching (due to the restriction of the built-in ocaml parser to LR(1) syntax), and a bug with the projection optimisation, I continued working on the selection push optimisation. I believe I understand the principle in detail now, but haven't finished implementing it yet.