Make zip_iterator take more than three elements

This uses Boost.Preprocessor macros to allow zip iterators to work with
arbitrary number of elements (the current limit is maximum boost::tuple
size which is 10 by default).

Refs #50
Merge pull request #51 from ddemidov/roomy_zip_iterator

Make zip_iterator take more than three elements