SI-6900 Tail call elimination + dependent method type crasher

Only the last commit is behaviour changing.

Attempted to fix this with finesse, but ended up using a localised sledgehammer.

Review by @paulp