doc: faq: why we don't check for root. (RhBug:1088166)
groups: redo the GroupPersistor class.

The old one has a serious design issue that it doesn't allow for storing
additional metadata, i.e. the clients (comps) are directly bound to the
serializaiton (json) mechanism. Adding new attributes is very hard.
Add comps Solver.

A centralized place to decide how different group operations should resolve.
groups: Integrate the redone componenets with Base.

Fix/update all tests.
refactor: extract out the transactioning part of _main().
groups: saving the persistent data.
groups: store format version of the groups db.
remove: OriginalGroupPersistor.
api: add group.upgrade opration to Base and CLI (RhBug:1029022)
refactor: move the group listing etc. methods() away from Base into GroupCommand.

They are non-api and not very useful besides for anything but output.
tests: add test for Base._translate_comps_pkg_types()
simplify groups/envs API methods in Base a lot.

They do not need to check everything (and thus rob the caller of the
propagated exception from below perhaps). Moreover, we are doing many checks
on the command line parsing now.
remove: cli._*aybeYouMeant().

These have no use and no love. We can add something systematic later if
there's a solid RFE.
tests: clean up the functions that load seeded comps a bit.
fix: encoding of yumdb directory names in py3.
Add dnf.goal.Goal deriving from hawkey.Goal.

DNF needs an extended version.
Override Goal.get_reason().

Adds a stateful mechanism for the group reason.
comps: store 'group' reason when installing a group-membering package.
comps: ensure only packages of 'group' reason get deleted on 'group erase'.

This completes the core implementation of full groups-as-objects semantics.
doc: document operation of 'group upgrade'.