removeUntilNode = (currentNode, targetNode) => {
    while (currentNode != targetNode) {
      if (!currentNode) {
        throw new Error('Did not encounter target node');
      }

      if (currentNode == this.bottomFold_) {
        throw new Error('Encountered bottom fold before target node');
      }

      const deadNode = currentNode;
      currentNode = currentNode.nextSibling;
      deadNode.remove();
    }
  }
Ensure that the rows between the top and bottom folds are as they should be.

This method assumes that drawTopFold_() and drawBottomFold_() have already
run, and that they have left any visible selection row (selection start
or selection end) between the folds.

It recycles DOM nodes from the previous redraw where possible, but will ask
the rowSource to make new nodes if necessary.

It is critical that this method does not move the selection nodes.  Doing
so would clear the current selection.  Instead, the rest of the DOM is
adjusted around them.

@param {number} topRowIndex
@param {number} bottomRowIndex