Rework how StepsCache responds to step updates to improve robustness

Calculating exact changes in a document can be extremely difficult to do
properly, as such, StepsCache ideally will not rely on them.

In this new approach, modifications to the step cache only require the
last known unmodified step. As iteration across the document occurs,
damaged regions of the cache are repaired and updated, and dead nodes
are removed from the system.

This improves the performance of local edits immensely, at the expense
of "long jump" type operations (e.g., add text then move immediately to
the document end).

Fixes issue #417