DNS Lookup Caching

Fixes #29.
I think a big number of requests will end up in this block and need to acquire the write lock. I'm not sure if singleflight is what we need here. We should either have a map of locks map[string]*sync.RWMutex{} to protect each `network:address` dial call.