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
If we get a bad kernel info request, try again ad infinitum? This seems like it could go wrong.