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)