Better quoting in dnf_pylint.
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.
cli: sort packages in the transaction summary.
c82267f refactoring droppped plugins.run_transaction().

Also the cult classic "Complete!" message. Ooops.
groups: promote unknown-reason installed packages to 'group' on group install. (RhBug:1116666)
refactor: loggers are module-level variables.

They are design to be that way, not instance attributes.
lint: rudimentary cleanups in tests.support.
lint: test_cli.py
refactoring: cleanup and linting in dnf.exceptions.
refactor: move Term into its own module.
move: test_output to tests/cli.
does not throw error when selector is empty (RhBug:1127206)