I think we should:
1. change SNESVI to support general complementarity constraints because only doing box constraints on state variables is lame
2. have a mode to solve the system in the full space, instead of eliminating the semi-smooth variables (which produces the bad conditioning)
3. eventually allow the dimension of the constraint space to change on each SNES iteration (would be fantastic for implicit contact)