Make RedundantCacheGroup properly handles partial failures

Hello @eford1, @chaosgame, @nicks, 

Please review the following commits I made in branch 'xiao-let-RedundantCacheGroup-handle-partial-failure'.

e350ba808399bd6d0f01416b99951918718da4e3 (2014-09-29 14:00:13 -0700)
```
Make RedundantCacheGroup properly handles partial failures

If it gets a partial failure, it will properly propogate existing results
and throw another partial failure.

It stops at the first time when an error happens and propogate that error
to upstream, in other words, it will fetch failed keys even if there are
other layers to try.
```
R=@eford1
R=@chaosgame
R=@nicks
oh, fixed.

On Mon, Sep 29, 2014 at 3:22 PM, Nathan <notifications@github.com> wrote:

> In lib/RedundantCacheGroup.js:
>
> > +          return res
> > +        })
> > +        .fail(function (errFromNextLevel) {
> > +          // If there are no partial results from the current level, no need to
> > +          // merge results.
> > +          if (keys.length === missedKeys.length) {
> > +            throw errFromNextLevel
> > +          }
> > +
> > +          var errorToThrow
> > +          if (errFromNextLevel instanceof PartialResultError) {
> > +            var data = errFromNextLevel.getData()
> > +            for (var i = 0; i < keys.length; i++) {
> > +              if (typeof res[i] !== 'undefined') data[keys[i]] = res[i]
> > +            }
> > +            errorToThrow = new PartialResultError(data, errFromNextLevel.getError())
>
> When I said throw here, I mean
>
> throw new PartialResultError
>
> Instead of having the intermediate variable errorToThrow
>
> —
> Reply to this email directly or view it on GitHub
> <https://github.com/Medium/zcache/pull/69/files#r18188017>.
>