Crafting a parser, part 5: error recovery and diagnostics

Report many errors per run and keep a usable tree — panic-mode recovery, sync points, and messages that don't lie.