///|
// Called only after progress publication, while the worker re-entry gate is held.
fn Worker::retire_completed(self : Worker, cancel? : Set[Int32]) -> Unit {
  if self.retirement.is_empty() {
    return
  }
  let retained = []
  let mut changed = false
  for (task, ready, finish) in self.retirement {
    if (cancel is Some(ids) && ids.contains(task)) || ready() {
      let status = self.scheduler.slots[task]
      self.scheduler.slots.remove(task)
      self.tasks.remove(task)
      finish()
      for offset in 0..