Now that #1510 has landed we still have one final issue to fix (ironically, the initial reason for #1510). https://github.com/facebook/react/pull/1510#issuecomment-170229012 + https://github.com/facebook/react/pull/1510#issuecomment-170229162, the problem being that `value` is managed as a property for the purpose of `<input>`, but `<progress>` requires it to be an attribute so that the attribute is correctly removed when null.

As discussed in the second comment, it seems to me that the right approach here is to actually remove all the special property logic from DOMPropertyOperations and instead implement it in the appropriate wrappers instead (ReactDOMInput, etc).

Repro: http://jsfiddle.net/670u7ure/8/
Original issue: https://github.com/facebook/react/issues/1431

cc @jimfb, @spicyj

props.innerHTML == null,
      'Directly setting property `innerHTML` is not permitted. ' +
      'For more information, lookup documentation on `dangerouslySetInnerHTML`.'
    );
    warning(
      props.suppressContentEditableWarning ||
      !props.contentEditable ||
      props.children == null,
      'A component is `contentEditable` and contains `children` managed by ' +
      'React. It is now your responsibility to guarantee that none of ' +
      'those nodes are unexpectedly modified or duplicated. This is ' +
      'probably not intentional.'
    );
    warning(
      props.onFocusIn == null &&
      props.onFocusOut == null,
      'React uses onFocus and onBlur instead of onFocusIn and onFocusOut. ' +
      'All React events are normalized to bubble, so onFocusIn and onFocusOut ' +
      'are not needed/supported by React.'
    );
  }
  invariant(
    props.style == null || typeof props.style === 'object',
    'The `style` prop expects a mapping from style properties to values, ' +
    'not a string. For example, style={{marginRight: spacing + \'em\'}} when ' +
    'using JSX.%s',
     getDeclarationErrorAddendum(component)
  );
}
function enqueuePutListener(inst, registrationName, listener, transaction) {