fn advance_upper(&mut self, upper: &mut Antichain<Self::Time>) {
        self.map_batches(|batch| {
            if batch.is_empty() && batch.lower() == upper {
                upper.clone_from(batch.upper());
            }
        });
    }
Advances `upper` by any empty batches.

An empty batch whose `batch.lower` bound equals the current
contents of `upper` will advance `upper` to `batch.upper`.
Taken across all batches, this should advance `upper` across
empty batch regions.
differential-dataflow/src/trace/mod.rs