Clarifications:

>  • Implement your proposal but skip over the (t ...) and integer
    records

I mean "skip" only for the "look ahead to validate" part. Not to skip
completely.

>   • Restructure the C code so as marker adjustments are always
    immediately before deletion records

I meant "chronologically" before, not "before" in the list. I think
the desired ordering would be:

  Value: (nil
   (#("   " 0 3
      (fontified t))
    . 12)
   (#<marker at 12 in foo.py> . -2)
   (#<marker at 12 in foo.py> . -2)
   (#<marker in no buffer> . -3)
   (#<marker in no buffer> . -2)
   (t 20985 26927 0 0))