Massive function reworking

All message sending functions are now fully asynchronous, not just using
the async keyword. This meant offloading the message sending to a
separate thread. Also, there is more detailed error codes that get
returned instead of just true, false, or null. This closes #5 and closes
#6.