Add an async version of the SE chat wrapper.

This version does not block on send. This gives future room for
expansion and monitoring (e.g. shoot an email if the message queue
gets too long.)

As a result of this change, the non-async wrapper interface also
changes and clients must call .logout() on exit. This call allows the
sending thread to exit cleanly while still blocking on an empty queue.
Async wrapper: add logging

Threads aren't fun without logging. Log all the things!
Wrapper: actually do register having logged out.
Async wrapper: you need to import handlers separately.

TIL.
Set logger level properly
Merge branch 'master' into lazers

Conflicts:
	test.py (also logout)
test: Switch to async wrapper

LAZERS travel at the speed of time.
You can't ask them to stop for messages.
postSomething: return decoded JSON if possible

I'm not sure how it worked before, but now the json conversion is
explicit. Unfortunately error messages are not served over JSON.
Async wrapper: more logging fixes.
Merge branch 'master' into lazers
test: give the thread a chance to spawn

Race condition between logging out and starting the sending thread.
In "production", the main thread is not going to "pump and dump" so
this won't be a problem.
Async wrapper: refactor waitings

Now the backoff is handled more consistently without as many
hardcoded constants.

Findings:

* If you don't wait between messages, you get rapidly increasing
  backoff every 2nd message; how rapid depends on your backoff
  multiplier.
* If you wait 5 seconds between messages, you get reasonable backoff
  (still every 2nd message)
* If you wait 7 seconds between messages, you get no backoff at all
  and you can post as much as you want.
Merge branch 'master' into lazers