cache kernel_info reply for protocol adaptation

WebSocket connections will not open until kernel_info is retrieved, removing a race condition waiting for the reply to indicate adaptation, which could result in a v5 message being sent to a v4 kernel. The reply is cached, so that it need not be requested on each new connection.

closes #6740
What's the advantage of making this a coroutine?