Previously, I was plinking completed jobs from the linked list along with setting the timer to 0 in the case of firing jobs, but that did not cover cases where the job was not completed but still expired like the player canceling or the operator/building meeting some untimely demise. In that case the job would linger in the linked list and eventually return bogus values before giving a memory error. This prompted me to try and write a check to see if a job went gone on its own, but nothing I've found really works to that effect.
So, instead I'll just not use a link table and store only the job id, look for it on each iteration and drop the job id if its not found. Least, that's the plan. My new place is short on internet connection which makes it somewhat of a pain to check general lua docs, forums, etc.
Those cases are the ones that were worrying me (and I wasn't even attempting my own list), but after messing about with synthesized fake jobs I'm a little more reassured (but still apprehensive) they're being deleted properly from the built-in job list given they're real jobs that should just be handled normally.
Annoying the list didn't work out for you, I don't really know what to suggest.
As a side note, when linking lua-created jobs into the world and assigning a worker, the job in unit.job.current_job didn't carry the same name as the one in the built-in list but dfhack.job.is_equal() reported them as being the same. Some strangeness going on there.
I'd be interested to know an average job list size after some (ingame) years of play, could end up getting expensive searching through.
If that also fails I might just have to rip off your job checker and not store jobs anywhere at all 
Rip away, my dude. It was your idea!
Anyhow, nice going on the other improvements and fixes! Hadn't noticed the bork in the targeting, I was mostly just testing the cannon by shooting it at my own dwarves with a firer added to the cannon projectile, which prevents any kind of friendly fire (boring, but convenient for testing. Also a temporary requirement of my projectile modding script, should have that fixed soon).
If only the AI could bring guns and use them intelligently, could make turtling fortress a suicidal tactic.
Thanks, I hope they work and I credited you enough.
You're kidding me that the cloned projectiles don't have a firer ATM, right?
Just checked, crap. Also errors, double crap. Thanks for the heads up, I'll get on that now...
Edit: I remember I've tried adding it before and setting pelletProjectile.firer = projectile.firer just crashes. What am I doing wrong?