title: Boto3: Unable to set Metadata on put/upload
body: <p>The following code :</p>
  
  <pre><code>client = boto3.client(
      's3',
      aws_access_key_id='AKIA...',
      aws_secret_access_key='',
      aws_session_token=True
          )
  client.put_object(
      Bucket=input_bucket,
      Key=file_name_final,
      Body=open(tmp_file_name, 'r'),
      Metadata={'a':'b'}
  )
  </code></pre>
  
  <p>Crashes with :</p>
  
  <p><code>Metadata={'a':'b'} TypeError: Unicode-objects must be encoded before hashing</code></p>
  
  <p>On the other hand, using a Resource :</p>
  
  <pre><code>s3 = boto3.resource(
      's3',
      aws_access_key_id='AKIA...',
      aws_secret_access_key='m/twhd6ow8aRuf+gjQcL8gu+bS5Y3tAVjcTe1+ai',
      aws_session_token=True
  )
  my_bucket = s3.Bucket(input_bucket)
  upfile = my_bucket.Object(file_name_final);
  meta = {'a':'b'}
  upfile.upload_file(
      tmp_file_name,
      ExtraArgs={"Metadata":meta}
  )
  </code></pre>
  
  <p>crashes with <code>ExtraArgs={"Metadata":meta} : AttributeError: 'bool' object has no attribute 'split'</code></p>
  
  <p>I think I have tried all the variations on str('b','utf-8/ascii'), .encode() and .decode() and some very silly things, but nothing. Help? </p>