Cache mark locations during a single run of the parser

Greatly improves structural edit times in large documents during live HTML editing, because calling `mark.find()` repeatedly on large marked ranges is very slow.

There is still a lengthy lag in very large documents due to repeated calls to `cm.posFromIndex()`. I'll be looking at that next.

@dangoor