Restructure Arbitrary impls for 3- and 4-tuples
Restructure Arbitrary impls for 3- and 4-tuples

The implementations of the Arbitrary trait for 3- and 4-tuples have been
restructured. The shrink method now calls its corresponding implementation on
the first element and the tail, i.e. the smaller tuple created by cutting off
the first element. With variadic generics this could eventually be transformed
into a recursive function.

This is done in preparation for using macros to generalize this to larger
tuples with less boilerplate.

erickt/quickcheck,bluss/quickcheck,tari/quickcheck