[FEAT] Rewrite commit message validator
It converts the module wide functions into a class which acts as an iterator
which can internally store information. This allows each line check to
actually know "outside information" without the need of module wide variables,
like whether it is inside the footer or whether a change id already occurred.
This also converts all of the checks into yields so that it is almost nowhere
necessary to actually provide the line number it acts on. This changes a bit
the logic but also makes sure that the line numbers are now sequential.