The runIO function lets you run an I/O computation in the Q monad.
Take care: you are guaranteed the ordering of calls to runIO within
a single Q computation, but not about the order in which splices are run.

Note: for various murky reasons, stdout and stderr handles are not
necesarily flushed when the compiler finishes running, so you should
flush them yourself.

It's a bit gruesome to use an Exp as the
operator, but how else can we distinguish
constructors from non-constructors?
Maybe there should be a var-or-con type?
Or maybe we should leave it to the String itself?