_processChange({currentText, proposedText, onSuccess, onFail=()=>{}}) {
    const current = {
      text: currentText,
      selectedRange: this.selectedRange()
    };
    const proposed = {
      text: proposedText,
      selectedRange: { start: current.selectedRange.start + 1, length: 0 }
    };
    const change = this.hasChangesAndIsValid(current, proposed);
    const changeTriggeredFormatting = change && (
        change.proposed.text !== proposed.text ||
        change.proposed.selectedRange.start !== proposed.selectedRange.start ||
        change.proposed.selectedRange.length !== proposed.selectedRange.length
      );

    if (change) {
      onSuccess(change, changeTriggeredFormatting);
    } else {
      onFail();
    }
  }
Checks if a change is valid and calls `onSuccess` if so,
and `onFail` if not.

@param {object} options
@param {string} options.currentText
@param {string} options.proposedText
@param {function} options.onSuccess
@param {function=} options.onFail
@private