BUG-1493: split off recursion tracking and rework it
This patch reworks tracking of recursion state into a separate class.
This allows us to unify the four call sites and provide a simple
heuristic. A state object is allocated each time we enter a new child
and its buidlers are collected when we emerge from it -- resulting in
more accurate event reporting, eliminating false positives.
Further optimization allows us to stop recursing as soon as we know no
listeners are affected by the outcome at a particular level.
Change-Id: I2be29cebb79892c85a22e79b18c2e62f77bfb7d4
Signed-off-by: Robert Varga <rovarga@cisco.com>