Today I have:
- A hashname, which is just a string. I also sometimes have a *hashvalue* in the DHT, which is the value as a big integer.
- Pointer, with hashname, ip, and port
- Peer, which also has a public key
- Seed, which is a peer with an expectation that you can connect directly and the ability to create from JSON

These actually don't save information about pending open packets or lines, because as much as possible I would like these to be data types which are immutable

Instead, the switch has a table for going from hashname to a sent open, and a table from going from hashname to line.

The incomplete hashname (which for me is a pointer w/ reference to server that I seeked it from) doesn't exist as an explicit object today, because you only have a hashname in this state while trying to convert it to a full peer with a line.