Also, this `dump_summary` implementation is pretty odd: it assigns ivars but doesn't use them.  I guess it assigns them for later use by other methods used by subclasses but it seems like a pretty odd/undesirable form of coupling.  Now that we have the notification objects, these values are all packaged together in one object so I think there's less need to store the ivars here; instead any methods that need this data should take the notification object as an argument.

In general, the whole base class pattern here is pretty fragile; it would be nice to move away from it.  We shouldn't be restricted from refactoring this kind of stuff because of 3rd party formatters (although, maybe we are: that may be a concern that prevents us from making further changes).  Maybe whatever utility the base classes are providing now can be moved into another object or a mixin or something that has no dependencies on the instance variables of `self` and instead takes notification objects as arguments and does its thing?

(I realize this suggestion greatly adds to the amount of work for the formatter updates but if we don't make these changes now we'll be stuck with what we have until 4.0).

Actually, if we do move away from inheritance as the recommended/supported mechanism for formatters to re-use functionality from what we already have, we could leave the base-classes in place as-is from 2.x and leave them just for legacy support.

Thoughts?