clean up variable names for product_id.ProductManager
more test cases for productid.py
docstrings
more tests cases, for ProductManager.update_installed
no reason for ProductManager.__get_cert to be private

Change to _get_cert, makes testing easier.
add test cases for product id install scenarios
Change *Directory subclasses to use super()

This makes it a little easier to mock out
parent classes for testing.
make DatabaseDirectory use super() like other *Directorys
more tests for productid and ProductDatabase

Add many cases for productid.ProductManager, and
add some cases for ProductDatabase, including
stubbing a DatabaseDirectory
let ProductData support multiple repos per product

add test cases
productid db now supports multiple repos per product id

This fixes almost all of the weird product/repo scenarios,
except of course, for the one I set out to fix.
more notes/docs
859197: add special case for products that provide 'rhel-' tags
move cert install/db stuff until we find all cases first.

Goal here is to find the list of stuff to be installed,
potentially call a plugin that could update that info,
then install. So a plugin could blacklist a particular
product id for example.

Also, more doc strings.
move cert deletion to after collection of certs_to_delete

Allow for a plugin/hook to manipulate the certs_to_delete
list.

Misc cleanup.
remove redundant comment
move rhel product cert check to _is_rhel_product_cert

Note: this duplicates releases.py:ReleaseBackend._is_rhel
a bit. So that could use some refactoring.
cleanup tmp dirs

And give the tmp dirs a common prefix to make it
easier to cleanup if need be.
support old productid.js format as well

Old format was json dump of a dict of
form:
        {'product-id-string': 'repo-id-string'}

while the new format the value is a list, like:
        {'product-id-string': ['repo-id-string']}

If the value in the dict is a string, we add it to
a list and return it, to match the new format.
test case cleanup