Use strings as the type for DOM elements

This makes ReactDOM a simple helper for creating ReactElements with the string tag as the type. The actual class is internal and created by instantiateReactComponent. Configurable using injection.

There's not a separate class for each tag. There's just a generic ReactDOMComponent which could take any tag name.

Invididual tags can be wrapped. When wrapping happens you can return the same tag again. If the wrapper returns the same string, then we fall back to the generic component. This avoids recursion in a single level wrapper.
createDescriptor (I'm going to rename to createElement) doesn't really care about the type of the `type` field that you're passing in. Whatever is passed in is what gets out. It's not overloaded. It's just a way to create these descriptor objects. They could also be inlined.

The overloaded part is when these are returned as child element. They will either instantiate the class or create an internal native component. The native representation should never be exposed outside the engine, because that allows people to touch implementation details. It also requires web components (and other tags) to be registered. By allowing a string to be past, we avoid the need for a whitelist.

We could potentially use numbers or placeholder objects, but these would not be real classes anyway. It seemed simple to use strings since these don't require anything to be in scope, which means that we can get rid of `@jsx React.DOM`.