Several improvements to SocketsHttpHandler perf (dotnet/corefx#41640)
* Do not force-parse TryAddWithoutValidation headers in SocketsHttpHandler
When enumerating headers to write them out, do not force them to be parsed if the user explicitly asked for them not to be with "WithoutValidation". If the key/values are incorrectly formatted, the request may end up being written incorrectly on the wire, but that's up to the developer explicitly choosing it.
* Revert HttpRequestHeaders.ExpectContinue optimization
Several releases ago, when we weren't paying attention to ExpectContinue, we optimized away the backing field for it into a lazily-initialized collection; that made it cheaper when not accessed but more expensive when accessed, which was fine, as we wouldn't access it from the implementation and developers would rarely set it. But now SocketsHttpHandler checks it on every request, which means we're paying for the more expensive thing always. So, revert the optimization for this field.
* Avoid allocating a string[] per header
When we enumerate the headers to write them out, we currently allocate a string[] for each. We can instead just fill the same array over and over and over.
Commit migrated from https://github.com/dotnet/corefx/commit/
4d346a9ab7b6e619dae3784283acb87bb7a825c9