Constraint programming for appendix paragraph markers

Builds on #249 and #250, re-using the paragraph marker solver for appendices.

More or less works by collecting paragraphs between headers and running derive_depths when the next header is seen. There's no special logic around images (though that might make sense in the future) -- images, tables, etc. are treated as marker-less paragraphs.

This solves a few issues, notably situations like: 1, a, 2, i, ii. The previous logic would assume the "i" was a lower-case marker (like the "a" preceding it), but the constraint-programming solution figures it out.