Refactor so a thread isn't spawned for each sent message.

When creating a TcpSender, a helper thread is spawned which receives messages to send. This way, sending is lighter-weight and still nonblocking while maintaining a predictable order for received messages. Closes #3