Simplify `logoutOtherClients` and fix `onReconnect` race.

If we called `login` and then called `logoutOtherClients` before the login
result was recieved, then we would end up with no `onReconnect` callback. Fixed
by just leaving `onReconnect` as it is when calling `logoutOtherClients` -- we
were only replacing `onReconnect` for the sake of tests that have since been
rewritten much more cleanly.

Fixes #1616.
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.
Merge branch 'fix-issue-1616' into devel

Fixes #1616
Add History.md entry for #1616 fix