Thanks for working on my previous points.
I've made a pass over the code and stream-lined a few things further,
see the recent commit message into my new branch. I didn't get to
finishing it anymore, there's still some bug in the new serialization
methods (I think).
I have one more request: I'd like to get rid of as many
GetBytes()/CopyIPv6() calls as possible. Using those seems generally
error-prone and I think we should avoid that by moving code into
IPAddr.* where we can can. I think some of their uses is just an
artifact of how the old code was structured. Mind going through and
see what can be done differently?
I've done a bit along these lines for the serialization code already,
but another example is the various hashing code. Can we add methods to
IPAddr to call from the hashing code so that it doesn't need to care
about the internal representation?