Reduce/broadcast API

Summary:
Adding reduce and broadcast API

Reduce and broadcast API should be a simplest comprehensive API for what it and aggregators do,
and has somewhat simpler implementation, since there is no strange interaction with values from
previous and next superstep.

It is very flexible and allows building more complex abstraction on top of it.
Aggregators API is built on top of it in AggregatorToGlobalCommTranslation,
when reverse is not true, which shows it is more flexible then previous API.

Once primitive types diff goes in, it will be trivial to create generic reducers
(instead of having huge number of specialized aggregators)

Current aggregator API has multiple issues:
- no matter whether aggregated values are needed on workers, they are distributed to them
- there is no way to register aggregator for a single superstep
- in order for master to send data to workers, it needs to go through an aggregator - even though it can only be Writable
- value to be aggregated and result of aggregation need to be of the same type
- logic of how to do aggregation is combined with how Aggregator is kept (i.e. aggregate(valueToAggregate), instead of aggregate(currentAggregatedValue, valueToAggregate)), and so every aggregator needs to extend BasicAggregator, but that still limits what can be done.

Related to https://phabricator.fb.com/D1303953

Test Plan:
All unit tests, will run some jobs on production.
Will add unit test to use reduce/broadcast directly, instead of through aggregators

Reviewers: majakabiljo, avery.ching, pavanka, sergey.edunov, maja.kabiljo

Differential Revision: https://reviews.facebook.net/D21423
Merge remote-tracking branch 'upstream/trunk' into trunk