provide callback to socket.send

If the user doesn't provide a callback, we can hit error situations
which would cause an uncaught exception