Convert the code over to use boost fusion instead of hand rolled algorithms.

Fusion views and containers are more efficient than constructing
tuples all over the place
Trying out boost::ref to reduce copies.
We move to use fusion views to reduce number of copies of args when flattening.

We previously created 12 copies of each argument to call a function. Now
we create zero extra copies.