Revamp how changes are tracked in ShadeListBuilder

In general, we want to log whenever something changes between runs of
the ShadeListBuilder: when a notif is added, when a notif changes
sections, when it gets promoted to top-level, etc.

Knowing that something has changed (and how it has changed) is not
as easy to detect as it once was: a notif might be added early in the
pipeline but removed later on, resulting in no real change. A notif
might have a section assigned to it but have it set back to null
because its associated group gets destroyed later on. And so on.

To better track these changes, this CL packages up all of the "list
state" that we care about (parent, filter, section, etc) into a simple
object, ListAttachState. Every ListEntry has two attach states: the
current one and the previous one. Whenever we finish a run of the list
builder, we iterate over every ListEntry and check to see if its attach
state now differs from its previous attach state. If it does, we log the
differences.

Test: atest, manual
Bug: 112656837
Change-Id: I9f44ed05a455ebac2706c18bc1718a9697e805ce
8 files changed