Make the master Mworkers more robust to bad clients

Today if you create a client that does

```
import zmq

context = zmq.Context()
socket = None
while True:
    del socket
    socket = context.socket(zmq.REQ)
    socket.connect('tcp://127.0.0.1:4506')
    socket.send('foo')
```

Each asymetric call will cause a master process to go defunct. This patch will catch those exceptions, log them, and rebind the worker zmq socket.
On error in SREQ reset the socket. This will fix all cases where the master is too busy and we leave the socket in a state where we've done a send but not a recv.