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.
Use a macro to implement Arbitrary for tuples

The macro is recursive in the sense that the implementation for n-tuples
(for n > 1) refers to the implementation for the (n-1)-tuple. Using a macro for
this purpose allows to instantiate the implementation for larger tuples with
much less boilerplate than before.
Implement Arbitrary for n-tuples up to n=12

The macro allows us to do this now. Tuples larger than n=12 are not possible as
Rust does not implement Clone for these.
Merge pull request #41 from aepsil0n/restructure_tuple_arb_impls

Restructure implementation of Arbitrary for tuples