add live reload feature for preview

This is the first time I do concurrent programming in Haskell,
so there could be improvements.

I'm using the software transactional memory package's channel
and mvar concurrency primitives, as well as the websockets
package. If preview mode is on, websockets javascript code
is injected into the page which establishes a connection
with the preview server's websocket server.

On the back-end, there's a map (an mvar) from routes to
reference-counted channels. A custom hakyll compiler is
spliced into the regular content compiler flow. This
custom compiler retrieves the map from the mvar and checks
if there's a channel associated with the content being
compiled, and if there is, pipes the compiled content
through the channel, which is picked up by the websocket
server and further piped to the javascript client-side,
which simply replaces the .entry-content div with the
compiled content.

Tested on posts, notes, and pages.

Blog post forthcoming.