-function 'startup()' (in namespace 'Sockets') calls WSAStartup() and also starts a new thread
-when the thread starts, it creates a new invisible window (for messages), the handle of which gets stored as a static variable
-The thread starts up a GetMessage() loop
-Any new ASocket will call WSAAsyncSelect using the invisible window's handle, and will add an entry to a static std::map container using its SOCKET descriptor as the key and a pointer to itself as the value. Also, it will be passed a HWND as a parameter, which will be stored for later use.
-The message handler for the socket messages uses the static std::map to find the appropriate ASocket object and set its 'readable', 'writable', etc. variables to true. After this, it re-posts the message to the HWND stored in the object earlier, in case the user wants to handle the message him/herself as well.