Okay, so here's how to make a spring: Instead of having the constraint routine automatically force two verlets to be exactly the constraint's distance apart, you modify the routine so that for some "springy" constraints it'll only move the verlets a fraction of that distance per iteration. A rigid spring would move the verlets, say, 80% of the distance; a soft one, only 20% or so. This way the verlets will slowly go back to where they ought to be instead of snapping taut.