Use printf

it's less messy than using (++) everywhere.
[regression] only interpret IO ()

If we try to tell hint to import ByteString in a qualified way, we get a
compilation error because it looks for the unqualified ByteString. This
is presumably because the type of the output, that is, the (as ::
ByteString -> IO ()) somehow gets embedded into the expression to be
evaluated, and this embedding doesn't take qualification into account.

The workaround (short of fixing hint) is to only evaluate expressions
which don't depend on ByteString or other things we want to qualify. I
noticed that IO () works fine, even though we ask for the prelude to be
qualified. So I am moving all the code which we used to run after the
evaluation to Hawk.Representable, where it will be visible to hint, and
I construct an expression which will run this post-processing in hint.
This allows the expression to have type IO ().

At this stage, the implementation is only a proof of concept, so not all
hawk features are supported. In particular, I ignore the -d and [file]
arguments. It should be fairly easy to restore those features.
Merge branch 'qualify_bytestring' into merge