nsqd: fix race for client subscription cleanup

SubEventChan is buffered to prevent deadlocks so it
isn't guaranteed that messagePump() will recv
the channel subscription state update.

If a client races and disconnects, messagePump()
exit will not tell the channel to remove the
client metadata.

This moves the code to the readLoop() exit path
which has no memory race reading client.Channel
and can always properly cleanup.
nsqd: fix theoretical client/message delivery race

SendMessage() was performing an unsafe read of client.Channel
and both StartInFlightTimeout() and client.SendingMessage()
should be performed before any potential early exit
due to errors to prevent orphaned messages.
Merge pull request #278 from mreiferson/clients_278

nsqd: client races