Implement zip with interms of zip

Implementation of zip algorithm as the primitive operation for typelist leads to code that I consider as easier to understand.
   
The original implementation of zip_with creates a typefunction by chaining bind multiple times for each corresponding set of typelist elements. I mean that invocation of zip_with on list (a1, b1, c1) and (a2, b2, c2) will create following list with following functors:
  (bind(bind(f, a1, _all), _a2, _all), bind(bind(f, b1, _all), _b2, _all))
Which invocation will result of creating list that contains
  (f(a1, a2), f(b1, b2)).
    
The implementation of zip provided in this commit implements the zip function as the adding corresponding typelist elements to corresponding typelist of initial list of empty list. I consider this implementation as more intuitive.