`AsyncTCPPubChannel.send` should not raise StreamClosedError
`AsyncTCPPubChannel.send` should not raise StreamClosedError

Some callers, such as `AsyncAuth.sign_in` expect `AsyncTCPPubChannel.send`
to succeed or return a specific exception such as `SaltReqTimeoutError` or
`SaltClientError`. If a different exception is thrown, it will not try to
reconnect to any master(s) and so the salt-minion is effectively inactive.
When the salt-master disconnects (eg shutdown for maintenance), internally
there will be a `tornado.iostream.StreamClosedError` in the salt-minion.
Now, we convert this to a `SaltClientError` so that it will be more
recognizable to the caller.

Also, sometimes `SaltMessageClient.timeout_message` is still invoked after
a `StreamClosedError`. To avoid a `KeyError`, always check to make sure
`message_id` is still in `self.send_future_map` before trying to access
it.

Signed-off-by: Sergey Kizunov <dfddabaa9af05982b01940b837a87844148069c9@ni.com>

saltstack/salt,saltstack/salt,saltstack/salt,saltstack/salt,saltstack/salt