I think there's a bit of a problem with this loop in the case where the start & end tokens are the same.  There's some ambiguity when we return from \_findCommentStart() -- since the start/end tokens look the same, it may have actually found an _end_ instead.  (We don't really know until we look at the first non-ws token after it).

That causes the loop here to misbehave: if the "start token" is actually the end of a block comment, the loop will happily scan past lots of other tokens until it finds the beginning of the _next_ block command, and misinterprets that as the "end."

We could fix that by having the loop here break if it hits a token where classType isn't null/"comment", but I worry a little bit that the general assumption -- 'hey, I found a "###", we must have found a start token' -- could bite us in other spots too.  I wonder if we could fix \_findCommentStart() to read ahead to verify that there's a comment token afterward.  (Seems like there's a little wrinkle that, since this munges the ctx arg, it could push ctx too far forward if anyone else, like _findCommentEnd(), is expecting to reuse that context obj... but hopefully that's easy to address).