code: void handleLastScannedRow(ByteString key) {
      try {
        currentState = currentState.handleLastScannedRow(key);
      } catch (RuntimeException e) {
        currentState = null;
        throw e;
      }
    }
docs: Handle last scanned row events from the server.
  
  <p>The server might return the row key of the last row it has scanned. The client can use this
  to construct a more efficient retry request if needed: any row keys or portions of ranges less
  than this row key can be dropped from the request. The retry logic is implemented downstream
  from the logical rows produced by this class. To communicate this information to the retry
  logic, the state machine will encode the last scanned keys as scan marker rows using {@link
  RowBuilder#createScanMarkerRow(ByteString)}. It is the responsibility of the retry logic to
  filter out these marker before delivering the results to the user.
  
  <p>The scan marker must be immediately consumed before any more events are processed.
  
  <dl>
  <dt>Valid states:
  <dd>{@link StateMachine#AWAITING_NEW_ROW}
  <dt>Resulting states:
  <dd>{@link StateMachine#AWAITING_ROW_CONSUME}
  </dl>