group persistor: generate diffs between old and new DBs.

Useful for informational output.
Add dnf.util.get_in() to navigate nested dicts with sequences of keys.
groups: visualizing the groups transactions.
groups: commiting the persistor data should only happen at one place.
groups: rearrange things in CLI so user has to confirm the group changes.
refactor: cli: massively simplify how errors are propagated from do_transaction().

Using exceptions and loggers conveniently eliminates the need for the clumsy
(code, error_messages) tuples while making the handling more flexible overall.