code: function set(obj, key, val, immutable) {
      if (immutable)
          return _set(assign({}, obj), key, val);
      return _set(obj, key, val);
  }
docs: Set
  Sets a value on an object using dot notation or url path.
  
  @todo need to refactor this method.
  
  @param obj the object to set the value on.
  @param key the property used for setting the value.
  @param value the value used for updating the property.
  @param immutable when true the original object is NOT mutated.