i can only begin to imagine the tangled mess that the underlying code must be (i've read there was a crash caused by vermin getting caught by a cobweb!)
That's actually an easy crash to understand, because I've seen things like that in my code. When you're working with a big project, it's impossible to remember every little thing you did or predict how they will all interact...
In this case, I'd assume that when vermin were written, it was assumed that they would only die in certain ways, and, in particular, wouldn't die at a certain point in their move code -- they call a move function, probably, then do other stuff (or other stuff is done referencing them) under the assumption that they still exist after that movement.
Years later, when Toady coded webs capable of killing vermin, he didn't remember that he'd coded vermin movement code under those assumptions, and, as a result, they got killed during a function call that the vermin-code assumed would never kill them. The later code that attempted to access the vermin's data therefore caused a null pointer exception when it referenced the vermin that no longer existed.
At least that would be my assumption. It's a fairly common sort of mistake.