Extract snapshot code to standalone class

By moving the VerifyNoSnapshotsMojo logic to a standalone class, we can
wrap it with one or more functions.

As we are not tied to the Mojo any more, a generic SnapshotException is
now thrown when the SnapshotFinder fails. This can then be caught and
re-thrown as appropriate.
Add groupIds option

The groupIds flag is an inclusion list of one or more groupIds. The
SnapshotFinder will only report errors if they are in a project whose
groupId is contained in this list.

Note that all groupIds will still be explored recursively.

The default value is an empty list, which indicates all groupIds should
be checked.
Check each unique dependency path

Instead of having a global list of checked GAVs, what we really wanted
was to check each dependency once.

This fixes a bug causing short-circuiting of the tests once a common gav
was checked.
Add verbose flag

When verbose is true, every path to a failing gav from the base project
will be reported.

This can be an extreme amount of information, and will likely contain a
significant amount of repeated information when a shared dependency is
bad.

When verbose is false, only direct dependencies of the base pom that
failed will be reported, along with the corresponding set of bad
dependencies or parents that caused failure.
Clean up code

Added better javadoc and documentation.
Skip version ranges

If a dependency has a version range, such as [x,y), it is a) not
reproducible and b) un-resolvable. Certainly we could make a best guess
at which version to retrieve, but since we know this brings
reproducibility into question we instead simply mark it as an error and
skip that dependency for recursion.
Add enforcer rule

Created a RequireReproducibleBuilds rule for the Maven Enforcer plugin
that wraps the SnapshotFinder functionality.
Add failEarly message

Other plugins disclose when they've failed fast, so we should too.