Implement OpMergeParagraph

In order to improve the OT-ability of text and paragraph removal
with other operations, the merge behaviour has been extracted.

The logic for building up the necessary remove operations has
been encapsulated in TextController for now as all uses pass
through this point still.
Cleanup leading/trailing insignificant whitespace on paragraph merge

Failing to clean up these empty whitespace blocks will cause them to
unexpectedly become significant whitespace after a merge is performed.
Convert long regex into a switch statement for clarity
Ensure OpSetParagraphStyle position is first step within the paragraph

The merge paragraph op depends on the impacted paragraphs being identified
by the position of the first step within the paragraph. In order to
facilitate OT'ing of paragraph-based ops, all paragraph ops need to
consistently use the first step in the paragraph to identify the paragraph
they impact.
Implement OT support for MergeParagraph