Only send Compliance event when compliance changes

Create an MD5 hash of the key parts of compliance
and the consumer when compliance is calculated
and check it against the current hash value that
is stored on the consumer before sending compliance
events.

There is a possibility of collisions with this
approach, meaning an extra event will be sent,
but this is not a big concern.
> I'm guessing the double-iteration is in there because there's no guaranteed order to the various collections in a compliance (e.g. products a, b, c vs products c, a, b)?

Ya exactly. No guarantee on order.