def put key, value
      key = convert_key key
      
      if (prop = self.class.metadata[ key ])
        prop.set self, value
      else
        # We know {#convert_value} is a no-op so can skip it
        _raw_put key, value
      end
    end
def put key, value
      key = convert_key key
      
      if (prop = self.class.metadata[ key ])
        prop.set self, value
      else
        # We know {#convert_value} is a no-op so can skip it
        _raw_put key, value
      end
    end
Store a value at a key. If the key is a prop name, store it through the
 prop, which will check it's type.

 @param [Symbol | String] key
 @param [VALUE] value

 @return [VALUE]
   The stored value.