feat(WatchGroup): Allow measuring cost of running reaction functions and
reporting it.

To be able to measure cost of reaction function, dirty check and/or
dirty watch one needs to define ExecutionStats. ExecutionStats is
configured using ExecutionStatsConfig object. This object can be used to
define how many records to display when showing the stats, what's the
minimum threshold (in microseconds) for a record to be considered as
relevant as well as to enable and disable tracking the stats.

One can define ExecutionStats, ExectionStatsEmitter and
ExecutionStatsConfig like:

  m..bind(ExectionStats)
   ..bind(ExectionStatsEmitter)
   ..bind(ExectionStatsConfig, toFactory: (i) => new ExectionStats(...))

The results can be displayed using ngStats object. To obtain a reference
to an ngStats object type (in the console):

  ng = ngStats();

To display maxNumber (defined using ExectionStatsConfig object) of the
most expensive reaction functions type:

  ng.showReactionFnStats();

To display maxNumber of most expensive evals type:

  ng.showEvalStats();

To display maxNumber of most expensive dirty checks type:

  ng.showDirtyCheckStats();

One can use ng.enable() method to enable tracking and ng.disable()
method to disable trackin. To clear the results use ng.reset()
method.

To achieve least performance impact on the application make sure
that the ExectionStats is null.

  m..bind(ExectionStats, toValue: null);

That way no extra objects will be created and the impact on the
actual application will be minimal.

Add some tests

Some refactoring