Allow iterables in traverseAllChildren

This lets you use any kind of iterable as a container of react child elements. It also preserves keys when possible if the iterable is keyed.

 * Use an ES6 Map or Set to hold children.
 * Use an Immutable-js collection to hold children.
 * Use a function* which yields children.

Concretely, this removes the necessary conversion to JS objects if you're mapping over Immutable-js collections to get children, i.e.:

```
<div>
  {myImmutable.map(val => <span>{val}</span>).toJS()
</div>
```

Now we can remove the `toJS()` and the intermediate allocation along with it.
A couple reasons I think this is safe.

1) The Array.isArray() happens before this, so I'm not sure `Array.prototype.entries` is a concern here.

2) ES6 does add `Array.prototype.entries` and it would behave correctly if for whatever reason we removed the `Array.isArray` check above for ES6 browsers.

```
> a = [1,2,3]
[1, 2, 3]
> a[Symbol.iterator] === a.entries
false
> a[Symbol.iterator]().next()
Object {value: 1, done: false}
```

3) I have no other ideas for differentiating entry iterators of [k,v] tuples from iterators where the values happen to be arrays.

Example:

```
> a = [[div,div],[div,div]]
[Array[2], Array[2]]
> a[Symbol.iterator]().next()
Object {value: Array[2], done: false}
```