Refactored the struct sockaddr hierarchy

Sockaddr is now a base class, and has subclasses for Sockaddr_in and
Sockaddr_in6, so we can have the socks map operate simply, and still
maintain v4/v6 behaviour at the same time.  The map needed to use a
pointer to the key instead of the object itself, since the base class
is not instantiable.  We created a compare functor to dereference the
pointers for the needed comparisons.

We should consider whether the user maps should become unordered maps;
access speed may become a consideration with the O(log n) map.