unify websocket and async/streaming with AsyncChannel
unit test to make sure on-close is called
recyle AsyncChannel