when I first wrote pred_recdec I did the oopsie of making the error API just a single string with no raw data parts, and it turns out that doesn't just cause problems for using the API, but also how much stack space is used by the recursive descent function for some reason?
so I've been going in and changing how errors are made (in addition to adding machine-readable bits) to save stack space and the patterns I'm using to trick LLVM are weird, like "function + immediately invoked lambda" (????)