It's important to not modify the caller's reference because the caller's tls.Config may be reused between connections.  

I had the use case in mind reconnecting to multiple servers from a pool of URLs.  The tls.Config should keep the loaded and parsed x509 certificates while the hostname to verify would change based on the url parameter.  If the TLS config is modified with the ServerName from the prior call, then we wouldn't know if we should use the ServerName from the URL or the ServerName from tls.Config.

I would rather have tls.Config be a value rather than a pointer for this reason, but I'm following convention of tls.Dial where the nil pointer is a sentinel for the zero value.