The benefit of *not* indirecting through `Promise.call` is to avoid a latency bottleneck:

1. Use a `ThreadPoolExecutor(max_workers = W)` for small `W`
2. Queue up a large number `N` of long-running tasks via `Promise.call` and wait for completion with `Promise.collect`
3. When some task in the middle fails, its `respond` callback that's responsible for failing the `Promise.collect` promise gets enqueued via `Promise.call`, which enqueues it *after* the `N` long-running tasks, which blocks failure until `N-W` tasks complete