Reorganize logic of slide and collide.

Instead of random mixtures of patterns and guards, we use patterns
to identify the list lengths and isolate important list members, and
guards to choose outcomes based on the identity of those list members.
This has two benefits: first, logic holes or repeats are easier to
spot, and second, this version has better performance due to the
removal of ++.
Fix slide and collide logic; fill in missing cases, optimize.

The last commit duplicated the original logic more clearly; this one
changes the logic to eliminate redundancy and include fall-throughs.