Export the `Free` and `Pure` constructors

In order to be able to modify the AST tree, access to the constructors
is necessary. This is safe, since any value created using the AST
interface could be created using the monadic interface as well.

This will be used in a subsequent commit to implement an optimization
translation pass over a demo program.
Add a demo optimization pass

In order to demonstrate optimization passes on a program based on a free
monad, the demo program is extended to include some more `print`
actions, and an optimize function is added which optimizes away
subsequent `print` actions into a single `print` of the concatenated
string.