Use the encoding given in the HttpWebResponse headers

This is a pretty straightforward change to ensure that the proper `Encoding` is used when reading the response body as text based on the `Content-Encoding` HTTP header and/or the `charset` property in the `Content-Type` header.

Note that this pull request introduces a usage of Code Contracts. The calls to `Contract` methods are included for documentation purposes only; the static verifier *can* verify these calls are in the proper form and documentation tools *can* include the information in generated documentation, but by default the calls do not change the compiled code, dependencies, or anything else at all. They are simply included so someone reading the code can see that the method never returns `null`, and optionally verify this in their local development environment.