dht_test large providers test
dht bugfix: unlock on print
routing table: better printing (see bkts)
dht bootstrap err check fix + logging
net/interface: move more to Dialer
ctxio -- io with a context.

This commit introduces a reader and writer that respect
contexts. Warning: careful how you use them. Returning
leaves a goroutine reading until the read finishes.
dht/query: fix important panic

Withe queries (particularly providers), it was possible to
exit the query runner's Run BEFORE all its children were done,
because the runner itself only listened to the context. This
introduced the possibility of a panic (you can go check it
out by running the TestProvidersMany test on dht_test in commits
before this one).  Thankfully, ctxgroup saved the day with
almost _zero_ changes to the sync flow, and now we have the
guarantee that the query runner will only exit if all its
children are done. :heart:

Conflicts:
	routing/dht/query.go
dht: update on every received message

i made a separate function because we may want to update our
routing table based on "closer peers". maybe not-- these could
all be lies.
bootstrap test
respect don contexteone
dht bootstrap test: rounds. do nothing

odd behavior: only one dht (the last one) is seeing
changes to its routing table.
net/id: when dup id, wait on it.
dht_test: better bootstrapping logging
dht: removing extra newlines
dht: bootstrap query constants
dht/query: log when dialing a closerpeer
dht/dht_test: bootstrap synchronously. fares better.
dht: cleaned up dht_test.

TestProversMany still fails