message: Use optional chaining on merge-tree callbacks
  ## Description
  Uses more concise syntax for merge-tree callbacks. Note that our current
  compiler settings transpile this down to the more verbose syntax, but on
  ES2020 or later this would be a bundle size win. See for some
  related commentary.
diff: @@ -1151,15 +1151,13 @@ export class MergeTree {
  segment: pendingSegment,
  });
  });
  - if (this.mergeTreeMaintenanceCallback) {
  - this.mergeTreeMaintenanceCallback(
  + this.mergeTreeMaintenanceCallback?.(
  {
  deltaSegments,
  operation: MergeTreeMaintenanceType.ACKNOWLEDGED,
  },
  opArgs,
  );
  - }
  const clientId = this.collabWindow.clientId;
  for (const node of nodesToUpdate) {
  this.blockUpdatePathLengths(node, seq, clientId, overwrite);
  @@ -1247,8 +1245,8 @@ export class MergeTree {
  this.blockInsert(pos, refSeq, clientId, seq, localSeq, segments);
  // opArgs == undefined => loading snapshot or test code
  - if (this.mergeTreeDeltaCallback && opArgs !== undefined) {
  - this.mergeTreeDeltaCallback(
  + if (opArgs !== undefined) {
  + this.mergeTreeDeltaCallback?.(
  opArgs,
  {
  operation: MergeTreeDeltaType.INSERT,
  @@ -1362,14 +1360,12 @@ export class MergeTree {
  rebalanceTree(insertSegment);
  - if (this.mergeTreeDeltaCallback) {
  - this.mergeTreeDeltaCallback(
  + this.mergeTreeDeltaCallback?.(
  opArgs,
  {
  deltaSegments: [{ segment: insertSegment }],
  operation: MergeTreeDeltaType.INSERT,
  });
  - }
  if (this.collabWindow.collaborating) {
  this.addToPendingList(insertSegment, undefined, insertSegment.localSeq);
  @@ -1524,13 +1520,12 @@ export class MergeTree {
  }
  const next = segment.splitAt(pos)!;
  - if (this.mergeTreeMaintenanceCallback) {
  - this.mergeTreeMaintenanceCallback({
  + this.mergeTreeMaintenanceCallback?.({
  operation: MergeTreeMaintenanceType.SPLIT,
  deltaSegments: [{ segment }, { segment: next }],
  },
  - undefined);
  - }
  + undefined
  + );
  return { next };
  };
  @@ -1730,8 +1725,8 @@ export class MergeTree {
  this.nodeMap(refSeq, clientId, annotateSegment, undefined, undefined, start, end);
  // OpArgs == undefined => test code
  - if (this.mergeTreeDeltaCallback && deltaSegments.length > 0) {
  - this.mergeTreeDeltaCallback(
  + if (deltaSegments.length > 0) {
  + this.mergeTreeDeltaCallback?.(
  opArgs,
  {
  operation: MergeTreeDeltaType.ANNOTATE,
  @@ -1815,8 +1810,8 @@ export class MergeTree {
  (s) => this.slideAckedRemovedSegmentReferences(s),
  );
  // opArgs == undefined => test code
  - if (this.mergeTreeDeltaCallback && removedSegments.length > 0) {
  - this.mergeTreeDeltaCallback(
  + if (removedSegments.length > 0) {
  + this.mergeTreeDeltaCallback?.(
  opArgs,
  {
  operation: MergeTreeDeltaType.REMOVE,
  @@ -1859,15 +1854,14 @@ export class MergeTree {
  segment.removedSeq = undefined;
  segment.localRemovedSeq = undefined;
  - if (this.mergeTreeDeltaCallback) {
  - const insertOp = createInsertSegmentOp(this.findRollbackPosition(segment), segment);
  - this.mergeTreeDeltaCallback(
  - { op: insertOp },
  + // Note: optional chaining short-circuits:
  + // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Optional_chaining#short-circuiting
  + this.mergeTreeDeltaCallback?.(
  + { op: createInsertSegmentOp(this.findRollbackPosition(segment), segment) },
  {
  operation: MergeTreeDeltaType.INSERT,
  deltaSegments: [{ segment }],
  });
  - }
  for (let updateNode = segment.parent; updateNode !== undefined; updateNode = updateNode.parent) {
  this.blockUpdateLength(updateNode, UnassignedSequenceNumber, this.collabWindow.clientId);
  