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.

The CompE constructor represents a list comprehension, and
takes a [Stmt]. The result expression of the comprehension is
the *last* of these, and should be a NoBindS.
E.g. [ f x | x <- xs ] is represented by
CompE [BindS (VarP x) (VarE xs), NoBindS (AppE (VarE f) (VarE x))]