Broken commit. Refactoring ValidationResults and best practices. [ci skip]
Best practice cleanup. Untested. [ci skip]
Use extend() rather than iterating with append(). [ci skip]
Added missing return statement to XmlValidationResult.as_dict()
Refactoring of Best Practice validation code.
+ Made BestPracticeWarning a collections.MutableMapping impl.
+ Made BestPracticeWarningCollection a collections.MutableSequence
  impl.
+ Made BestPracticeValidationResults a collections.MutableSequence
  impl (as well as ValidationResults)
+ General code cleanup. Made use of new collections impl methods.
+ Reworked stix_validator.py _print_best_practice_results() to
  be more generic in the way it processes results. Results keys
  are displayed in alphabetical order now.

This needs a lot more testing!
Fixed issue where valid best practice results weren't being printed
Added --json to tox.ini commands
Fixed maximum recursion error in BestPracticeWarning. Other code cleanup
Made is_valid a property on ValidationResult class. Refactored control xpath validation code to use nested function.
Playing with metaclasses and decorators. Removed rule dict from __init__. Rule execution  now driven by @rule(version) decorator.
Broke out rule gathering logic from _run_rules() into a new _get_rules() method
Code cleanup
Moved file collection code to utils
Added more docstrings. Input validation.
Code cleanup
Remove unnecessary parameters