Stop treating encoded query string keys/values %ED %AC as failures just because CGI.escape can't handle them

* Replace `CGI.escape` with `URI.encode_uri_form_component` in `QueryHash`,
  which can handle the `"\xED"` that `CGI.escape` would fall over on.
* Stop pretending that this is somehow what RFC3986 would have done because `CGI.escape`
  did it. We should be encoding, not escaping.
* This is a major version bump only because we previously specced the broken behaviour
* Remove some tests that only had a point because of the previous failures