static clipTasksByTs(tasks, startTs, endTs) {
    for (const task of tasks) {
      if (task.parent) continue;
      WorkDuringInteraction.recursivelyClipTasks(task, undefined, startTs, endTs);
    }
  }
Clip the tasks by the start and end points. Take the easy route and drop
to duration 0 if out of bounds, since only durations are needed in the
end (for now).
Assumes owned tasks, so modifies in place. Can be called multiple times on
the same `tasks` because always computed from original event timing.
@param {Array<TaskNode>} tasks
@param {number} startTs
@param {number} endTs