Pass loop=bot.loop to asyncio.gather - we should have been doing this
Process messages with asyncio.async, so that plugins using threaded=False can run multiple at the same time, if they use yield from.
Change formatting for main a bit
Rename bot.threads to bot.handlers to be more accurate
Little bit more documentation of variables on CloudBot. Also, do manual garbage collection after loading plugins rather than before.
Basically rewrite main.py to have almost everything be a coroutine, and use asyncio.run_in_executor() for threaded stuff