Each component uses the Io interface only for synchronization and timeouts.
For this kind of functionality, each component creates its own Io using .init_single_threaded.
I think the “cost” of each single-threaded Io is negligible, at least in terms of memory consumption.
I also hope it results in fewer locks and less contention.