Split net structures into their own source files

 * Better separation of responsibilities
 * Client code is more readable
 * Each struct owns its construction from streams
 * Objects of type `net::ip::addr_t` can be fed to
   `std::ostreams` with `<<` and it will print
   the human-readable form.
 * Each header struct is loadable via static method:
   `net::ip::header_t::load( std::istream&, bool ntoh )`

closes #10