[BUGFIX beta] reduceComputed supports non-array dependencies.

`ReduceComputedProperty`s want 3 kinds of dependencies.

1. non-array dependencies 2. array dependencies with normal (total
invalidation) CP semantics 3. array dependencies with one-at-a-time semantics

It was previously only possible to create `reduceComputed`s with 3.  Macros 
could be written that would manually handle 1. and 2.  For example,
`Ember.computed.sort` does this.

This commit makes possible all three cases.

```js Ember.Object.extend({
 nonArray: 'string',
 totallyInvalidatingArray: [],
 oneAtATimeArray: [],

  computed: Ember.reduceComputed( 'nonArray',
                                 'totallyInvalidatingArray.[]',
                                 'oneAtATimeArray', {
   addedItem: function () { /* ... */ },
   removedItem: function () { /* ... */ }
 });
})
```

Arrays whose individual mutations should completely invalidate a
`reduceComputed` are specified by adding the `.[]` suffix to the dependent
key. Note that the items for this array are never passed to the `addedItem`
and
`removedItem` callbacks: they should be treated much like non-array
properties.

A straightforward motivating example is `Ember.computed.sort` - the items to
be sorted should be handled one-at-a-time, but the properties to sort by
should require a complete resort.

Fix #3600.