beginUndoableChange (attrName, elems) {
    const p = ++this.undoChangeStackPointer
    let i = elems.length
    const oldValues = new Array(i); const elements = new Array(i)
    while (i--) {
      const elem = elems[i]
      if (!elem) { continue }
      elements[i] = elem
      oldValues[i] = elem.getAttribute(attrName)
    }
    this.undoableChangeStack[p] = {
      attrName,
      oldValues,
      elements
    }
  }
This function tells the canvas to remember the old values of the
`attrName` attribute for each element sent in.  The elements and values
are stored on a stack, so the next call to `finishUndoableChange()` will
pop the elements and old values off the stack, gets the current values
from the DOM and uses all of these to construct the undo-able command.
@param {string} attrName - The name of the attribute being changed
@param {Element[]} elems - Array of DOM elements being changed
@returns {void}