resolves #1 add socket monitor functionality

Also addresses some surprising socket clean up behavior with
naive use of io_service.stop() and async operations which retain the
socket by shared_ptr (creating a reference cycle).