Computes a new cursor position from an old position and a count of
positions to move visually. If count is positive, then the new strong
cursor position will be one position to the right of the old cursor
position. If count is negative, then the new strong cursor position will
be one position to the left of the old cursor position.
In the presence of bidirectional text, the correspondence between logical
and visual order will depend on the direction of the current run, and there
may be jumps when the cursor is moved off the end of a run.
Motion here is in cursor positions, not in characters, so a single call to
move_cursor_visually() may move the cursor over multiple characters when
multiple characters combine to form a single grapheme.