refactor etag calculation to support a correct multipart key etag

This commit support providing the etag as a constructor argument instead of always calculating it from the key value. The benefit is that we can use this to calculate the correct etag for a multipart upload (essentially the md5 of md5's) upon completion.