code: function collectAndCombineLikeTerms(node) {
    if (node.op === '+') {
      const status = collectAndCombineOperation(node);
      if (status.hasChanged()) {
        return status;
      }
      // we might also be able to just combine if they're all the same term
      // e.g. 2x + 4x + x (doesn't need collecting)
      return addLikeTerms(node, true);
    }
    else if (node.op === '*') {
      // collect and combine involves there being coefficients pulled the front
      // e.g. 2x * x^2 * 5x => (2*5) * (x * x^2 * x) => ... => 10 x^4
      const status = collectAndCombineOperation(node);
      if (status.hasChanged()) {
        // make sure there's no * between the coefficient and the symbol part
        status.newNode.implicit = true;
        return status;
      }
      // we might also be able to just combine polynomial terms
      // e.g. x * x^2 * x => ... => x^4
      return multiplyLikeTerms(node, true);
    }
    else {
      return Node.Status.noChange(node);
    }
  }
docs: Given an operator node, maybe collects and then combines if possible e.g. 2x + 4x + y => 6x + y e.g. 2x * x^2 * 5x => 10 x^4