Multiple output formats

This adds the ability for Reviki to render to formats other than HTML, and includes renderers for HTML, Docbook, Docx, XSL-FO, Rich Text, PDF, and PostScript (the latter four done by Apache Fop from the Docbook).

## Dependencies

 - This now needs the Docbook roundtrip XML files and Apache Fop, for the XSLFO renderer.

## Breaking Changes

 - `MarkupRenderer` is now an abstract class, rather than an interface. Furthermore, it is now parameterised by a generic type argument (specifying the result type of the rendering process).

 - `MarkupRenderer`'s `render` method is now called `parse`, and the `render` method handles producing the output format.

 - `ASTNode`s no longer have a `toHTML` method.

 - `TaggedNode` no longer exists.

## Additions

 - `StreamView` has been added to support sending unmangled binary data to a client.

 - Pages now include a drop-down box listing different available output formats towards the top-right of the screen. This doesn't include all of the formats, only those I thought most useful for human use.

 - A new `ASTRenderer<T>` abstract class, based on `ASTVisitor<T>` with helper methods for rendering ASTs and tracking directives.

 - A `RendererRegistry` which provides the ability to retrieve renderers with streams as outputs (+ a default html renderer) by name

 - `PageStore` now has a method, `attachmentBytes`, to get the contents of a named attachment as a byte array.

## Other changes

 - Leading and trailing whitespace is now removed from `Inline` nodes in the AST.

## Not very satisfactory things

 - The Docbook renderer renders blockquotes as `<section>` tags with a `role` attribute, rather than with `<blockquote>` tags. This is because Docbook blockquotes cannot contain all of the elements permitted by our grammar.

 - The Docx renderering of tables computes a fixed width based on the page width, and also separates adjacent tables by empty paragraphs. This is to work around table rendering issues in LibreOffice, but isn't very pretty.

 - The Docx renderer is very side-effectful. In fact, every rendering method except `visitPage` returns null and instead mutates some global state.