Benchmarks for construct, copy, move, swap, destroy and invoke, with 8

different input states.

For the cases that matter, it tests with and without allowing constant

value propagation from construction into the operation tested.

This also adds helper functions to generate the cartesian product of

different configurations and generate benchmarks for all of them.