We don't seem to need to open and bind the socket.

Unfortunately, can't remember why we did it that way.

--CAR and BRJ
Non-singleton APSEthernet

Make a library instance of APSEthernet and instantiate each APS() with a
pointer to it.

--BRJ and CAR
Explicitly manage APSEthernet lifetime with a cleanup method.

The windows runtime is free to unload DLLs in whatever order it chooses.
Unfortunately, this means that WINSOCK can be unloaded before our
driver, causing all the ASIO cleanup methods to bail. Avoid this by
explicitly calling cleanup() before exiting.