Massive refactoring to perform citation detection using one unified regex, with sub-regexes identified through named capture. sub-regexes also now must use named capture instead of indexes. these sub-regexes are, behind-the-scenes, modified so that their own named groups are prefixed at scan-time, then un-prefixed when submitted back to that regex's processor. performance is now twice as slow\! this is done to support the next feature, a replace callback, where performing the scan in one pass and not multiple passes is crucial to avoid strange race conditions where the string is a intermediate replaced state. this is the longest commit message I have ever entered.