When using `when(first:)` without `cancelRemaining`, the returned Promise is considered a child of all of the input Promises. This means it will prevent cancellation propagation from any other child promises of those inputs. We should see if it's reasonable to "detach" the returned Promise from the input promises after the returned Promise has resolved so e.g. it won't prevent cancellation of any outstanding input promises whose other children have cancelled.
We can't simply propagate cancellation at this point because we don't want to cancel the other inputs if we're the only child.
We should support being able to use run loops as contexts.
Right now we use `.then`, `.catch`, `.recover`, and `.always`. Should we adopt more functional terminology, such as `.map`, `.flatMap`, `.mapError`, etc? This would mean less overloading.