Using SwiftNIO Future/Promise to make async/await style TCP socket interface

in general, you want the handlers to be associated with exactly one channel for the callback notifications to be meaningful. so it’s often better to create them in the channelInitializer(_:) closure. one client bootstrap can call it multiple times during connection setup.

an EventLoopPromise is like a CheckedContinuation. if you never complete the promise, the future will never return. the eventLoop doesn’t associate the promise with the channel, and you haven’t passed the promise along to anything that could complete it.