NAT detect

Adds in some methods that determine if you are behind a NAT when connecting to a remote peer. Also prevents connection to loopback addresses
this should be in `swarm.Dial`. It should be ok for connections to self. It's not ok in the swarm context.