New overloads of codispatch() and copost().

This commit adds overloads of codispatch() and copost() that let you
specify how many tasks will be run concurrently. By default, when you
call:

    copost(t0, t1, ..., tn-1, tn);

then functions t0 to tn-1 will be run concurrently. The return values of
the those functions are passed to tn. For example, the following code:

    copost(
      []{ return 1; },
      []{ return 2; },
      []{ return 3; },
      [](int a, int b, int c)
      {
        std::cout << "a = " << a << "\n";
        std::cout << "b = " << b << "\n";
        std::cout << "c = " << c << "\n";
      };

will print:

    a = 1
    b = 2
    c = 3

Sometimes we may want this final function to produce a result, which we
then do something else with. For this we use a version of copost() where
the number of concurrent tasks is explicitly specified:

    copost<N>(t0, t1, ..., tn-1, tn, tn+1, ...);

In this case, the first N functions are run concurrently. The return
values of these N functions are passed to tn, the result of tn is passed
to tn+1 and so on. For example, we can write:

    future<int> f = copost<3>(
      []{ return 1; },
      []{ return 2; },
      []{ return 3; },
      [](int a, int b, int c)
      {
        std::cout << "a = " << a << "\n";
        std::cout << "b = " << b << "\n";
        std::cout << "c = " << c << "\n";
        return a + b + c;
      },
      use_future);
    std::cout << "result = " << f.get() << "\n";

and the program will now output:

    a = 1
    b = 2
    c = 3
    result = 6