Always update caret location even if it isn't visible

Though the caret visibility may be set to hidden, the caret still has
a client rectangle that can be accessed. It is important to keep this
up-to-date so the scrollIntoView logic works on a range selection even
when blinkOnRangeSelect is false.
Put caret register/remove functions side-by-side for clarity
Bind events directly to caret functions

The Caret itself already has logic to only perform expensive updates once
per redraw. There is no performance gained by CaretManager duplicating
this logic as well.

In addition, bind to any processing batch end. This is because any
type of edit may cause the caret to be pushed off screen including
adding annotations, splitting paragraphs, deleting text, modifying a
paragraph style etc. the most straightforward way to ensure the caret is
up-to-date is to check it's visibility on every edit operation.

Fixes #765