Avoid overwriting fresh tokens from other tabs.

* Before wiping a bad token from storage on reconnect, make sure that
  we're wiping the token that we tried and failed to log in with. Avoids
  logging out another tab that might have gotten a fresh valid token
  while we were logging in with the old, invalid one (though it is still
  theoretically possible).
* In the logoutOtherClients callback, try to log in with the token that
  we get in the response. Accounts for the situation where the server
  disconnects us before the callback runs.
* If we fail to log in with a token found during a localStorage poll,
  make the client logged out.
* Add a test that attempts to simulate one tab getting a fresh new token
  while another tab logs in with an old invalid token on reconnect. It's
  a WIP... I'm not sure yet if it makes any sense.