ReactDOMSelect makeover, fix edge-case inconsistencies and remove state

Broken behavior discovered/encountered by #1510

**EDIT:** I found a handful more broken edge-cases so I decided to do a large makeover instead, simplifying the logic and removing state entirely.

I've intentionally made it "reset to default" if you toggle `multiple` because it simplified the code and I don't think it's a sane transition (browsers don't on about what should happen either). But I could easily add it back if you disagree, but I figured it wasn't worth the size and complexity cost.

As far as I'm aware, all edge-cases should be fixed now.

~~Previously, state would only be updated on user interaction or when toggling `multiple`. This meant that any forced `value` update was not remembered when toggling `multiple` or becoming uncontrolled.~~

~~To solve this it has to read value during `componentWillReceiveProps`, which `LinkedValueUtils` couldn't do. So I updated `LinkedValueUtils` to take a `props`-object instead, which seems consistent with the direction of a reactjs-future proposal as well.~~

- [x] **Test plan:** `grunt test` and cursory manual testing
- [ ] Poach test-case from #2289

```
   raw     gz Compared to master @ 4f27dc30ad065856c9ed7de9c4dd8366801b9486
  -215    -85 build/react-with-addons.js
  -166    -92 build/react-with-addons.min.js
  -215    -83 build/react.js
  -166    -97 build/react.min.js
```
Looks like the type of `propValue` should be `{*}` because we should never get null or undefined with the new code, right?

Also, maybe `s/string/stringable/g`.