Major rewrite to allow a single rule to be more generic

e.g. CommandsInsteadOfModulesRule can check whether wget
or mkdir is executed by a shell command rather than the module
used, and return a different message in each case.

This involved a rewrite of tokenization, and a rewrite of how
matching works - now Rules need only return a match result
(None or False for no match, True or a message for a match)
The resulting rules are much simpler!
Added an argument to print a list of tags