add a DefaultDict (defaultdict with pretty print)

Shows the pretty printed version of itself as it's
repr.
Add ProductIdRepoMap as core of ProductDatabase

ProductIdRepoMap is a defaultdict(list)

Change ProductDatabase to use a ProductIdRepoMap as
it's product->repo map.

Add populate_content to support the old db format.
show os_name in rct output
only show os name if defined

product id's os_name won't be common,
so don't show it by default.
Add product certs with os_name in certdata
wip
split out the ent cert installer code

eventually make this into a good place to
hook "I just installed an ent cert" things,
like branding updates
first bits of branding model
start refactoring certlib, aiee
create UpdateReport in Certlib.CertLib and pass it
split UpdateReport into base class and sub classes

UpdateReport is now EntCertReport
rename CertLib->EntCertLib

And certlib.UpdateAction->EntCertUpdateAction
certmgr expects a ActionReport from Action.perform

create a HealingAction for HealingLib, reuse
EntCertUpdateReport for HealingAction.report.
Start splutting HealingLib into smaller
chunks

Make Actions have a ActionReport

Rename CertLib to EntCertLib and
certlib.UpdateAction to certlib.EntCertUpdateAction
reAction()'ify Factlib, add FactUpdateReport
reAction()'ify repolib, add RepoReport
HealinAction just uses an EntCertUpdateReport atm
general certmgr

split it into CertManager and HealingCertManager
certmgr type cleanup
the Action subclass is unneeded
wip - ActionReports, certlib cleanup, lock cleanup

all *Lib things return an ActionReport now

We provide a "ACTION_LOCK" via injection now, and
test fixture provides a non file based one.
ActionLock moved to lock.py
*Lib objects have-a Locker to run things that need
locks