`result_channel()` awaitable customization
When applied to spawn_many(), a tmc::chan_tok<Result> would be returned instead. Awaiters could then pull() results from the channel as they become ready. Due to the nature of channel, it could be shared with any number of awaiters. The lifetime of this channel may exceed the lifetime of the parent task. Once all of the spawned results are available, the channel should be closed.
This could also be expanded to spawn_tuple(), with the constraint that all results must be the same type. Expanding it to post_bulk() would not be as simple, since it doesn't have a return type; a new function would need to be created.
This entails creating a channel with EmbedFirstBlock = true and probably a reduced default block size. This channel must be passed to a wrapper task for each awaitable which forwards the awaitable result to the channel. Once all awaitables have completed, the channel should be closed.
An atomic countdown variable needs to be present for the wrappers to fetch_sub() against. This is similar to the current control block implementation of spawn_many(); however, the wrappers will be detached, so the control block must be allocated externally.
Due to the need to create individual wrapper tasks for each awaitable, and allocate the external control block, the performance of the implementation described here would likely be much worse than simply using spawn_many() for short-lived operations. However, it could be a very useful primitive, so let's think about how to reduce these allocations / improve performance.