### SUMMARY

Update validate-modules to report messages using named error codes like `version-added` instead of error numbers like `E305`.

This would match the behavior of other tools we use, such as pylint, which have one named error code per rule. This will also make ignore entries much easier to read.

Doing this before 2.9 is released will avoid potential backwards compatibility issues with ignore entries in collections.

##### ISSUE TYPE

Feature Idea

##### COMPONENT NAME

validate-modules

mismatched_deprecation = False
            if (filename_deprecated_or_removed and removed and not (documentation_exists or examples_exist or returns_exist)):
                mismatched_deprecation = False
        if mismatched_deprecation:
            self.reporter.error(
                path=self.object_path,
                code=318,
                msg='Module deprecation/removed must agree in Metadata, by prepending filename with'
                    ' "_", and setting DOCUMENTATION.deprecated for deprecation or by removing all'
                    ' documentation for removed'
            )
        return doc_info, doc
    def _check_version_added(self, doc, existing_doc):
        version_added_raw = doc.get('version_added')
        try:
            version_added = StrictVersion(str(doc.get('version_added', '0.0') or '0.0'))
        except ValueError:
            version_added = doc.get('version_added', '0.0')
            if self._is_new_module() or version_added != 'historical':
                self.reporter.error(
                    path=self.object_path,
                    code=306,
                    msg='version_added is not a valid version number: %r' % version_added
                )
                return
        if existing_doc and str(version_added_raw) != str(existing_doc.get('version_added')):
            self.reporter.error(
                path=self.object_path,
                code=307,
                msg='version_added should be %r. Currently %r' % (existing_doc.get('version_added'),