Add headers methods to WS API

This pull request attempts to fix the some of the API inconsistencies mentioned in #2240, and also supersedes #1913.

My goal was to keep the `WSResponse` API as consistent with `WSRequest` as possible. I think the use of the case insensitive map makes sense, as it's simple to implement and creates an easy to use API.