Async-ify SbtClient socket errors

The problem here was that SbtClient randomly threw SocketException
when you called close(), and this meant API users had to catch it
all over the place. Instead, we want requests with a reply
(things returning a Future) to fail the future, and requests with
no reply to just fire-and-forget (ignoring any socket exceptions).