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