Fix SSE key handling for S3 with py3 byte keys

There was an issue where if a non-str object (i.e byte/bytearray)
was provided, then the param validation in botocore would fail
the type checks because the SSE keys are modeled as a string.
While the long term fix is to switch this to a blob type, to
fix this issue, the customization is moved to before-parameter-build.
In this way we can convert the params before they hit the serializer
and validator and ensure that our base64/md5 converted values are
strings such that they pass the type check validation.

To ensure we don't have any issues I've also added integration tests
for this.

cc @danielgtaylor @kyleknap