About half the work for this was just passing through the settings via the config, node connector factories, sessions, and connector construct, and updating all tests. The rest was nothing more than a derived connector class. The connector and acceptor are socket factories, establishing one socket connection per instance, managing timeouts, name resolution, bindings, socket config, etc. So this just overrides
connector::handle_connect(...) and
connector::start(...) protected base class methods and implements the indirection on the socket strand.
https://github.com/evoskuil/libbitcoin-network/blob/master/src/net/connector_socks.cpp