Add a caching layer, so we don't pound cloud providers for ip addresses.

What about net.IP, which we've discussed using in the API (#1300)?