@bcwaldon  Could we use `net.DialTimeout` here?
`ResolveTCPAddr`, `SetKeepAlive` and `SetKeepAlivePeriod` could return quickly.
Though `DialTimeout` returns `Conn`, we could cast it to `TCPConn` for later operations.
I think current method is kind of tricky because it will leave the goroutine continue dialing.