It runs, but... just stacking the joint limit constraint Jacobian on
top of the primary task does not work when the primary task actually
wants to use the locked joint(s). Or rather, the LU-based
invertibility check does not tell me whether I'm mixing things that
may end up conflicting.

Must find a smarter way.

Maybe something like: is the primary still achievable if I knock the
locked joints out of its Jacobian? If so, knock them out and merge
joint limits with (modified) primary. But how to manage the change of
dimensionality?
Neat demo finally works... non-jittery joint limit, at the cost of
potentially running the task priority algorithm three times. That can
be sped up with caching, probably.