Rewrite of line boundary movement actions

Rewrite of line boundary detection logic to address numerous cursor movement issues (#555, #405, #227, #225, #224, #185, #124 and #98).

This also removes the last uses of the gui.SelectionMover class, allowing it to be removed in a subsequent PR.
Added a longer explanation in the code:
> Both a line boundary AND a paragraph boundary accumulator are necessary to ensure the caret stops correctly
inside an empty paragraph.
The line boundary accumulator requires a visible client rect in order to detect a line break, but for an
empty paragraph, there is no visible leading or trailing rect as there aren't any visible children.
As a result, the line boundary detection can't determine if an empty paragraph is a line-wrap point, but
the paragraph boundary accumulator *will* correctly determine that step iterator has moved beyond the
current paragraph.