Compute pixel rects of cursors and highlights in EditorComponent

Fixes #2726

Previously, we were passing the screen ranges of highlights and cursors into their components, then using editor to convert these ranges to pixel positions. This worked for the most part, but when the cursor blinked it could sometimes get out of sync with changes to the model, meaning we asked for a pixel position for a screen position that didn't exist.

This PR changes things to precompute the raw pixel positions for cursors and highlights in the root component and pass it down. When the cursor blinks, we don't need to recompute a pixel position because it's a property that is passed in from the outside and doesn't change in this case.

This kind of approach seems to be what React wants: Compute an immutable snapshot of the model in the root component and pass it down from the top.