Refactor PackageInfo() to accept a scan argument
Refactor PackageInfo() to accept a scan argument

This factors some code out of the PackageList class and into the
PackageInfo class directly, allowing it to take an optional boolean
parameter that will cause it to scan for and find its files based on
its name.

The code in the PackageList() class now calls these new methods on
PackageInfo instances as it's performing it's own scan, providing them
their information one step at a time.

This allows code in OverrideAudit that knows it's only going to handle
data for a single package to collect the information for just that
package without having to perform a full package scan, which could
potentially be costly in situations where people have many packages
installed.

Since it's now possible to create a PackageInfo with any name and not
just ones with names we know must exist because we found a file, the
class now has an exists() method that you can invoke to check if any
files or folders were found for this package or not, allowing you to
detect if it's actually a package at all.

The scan code takes the same care as the PackageList scan does to
ensure that the case of the name of the package is as canonical as
possible. To this end, when performing the scan, the case of the first
found result is used as the name of the package in place of what was
actually provided.

This presumes that one of the shipped or installed packages (they are
searched in that order) will have the "correct" case.

OdatNurd/OverrideAudit