Implement MarkupM as a free monad

Here's a first go at implementing MarkupM as a law-abiding free monad.

The advantage that I see here is that we can now use the return value if we want to. Some possible applications:

- Generate fresh IDs and names (example from the book)
- Get a handle on the DOM element to attach event handlers

Also, we might want to use something like `purescript-free` and/or `purescript-inject` to make this into an extensible DSL.

The performance seems reasonable to me, and I can't think of a reason why it would be much worse than before.