reduce_by_key() may take several tied keys

This version also requires a device function for comparing keys.
Example:

    vex::vector<int>    ikey1(queue, n);
    vex::vector<long>   ikey2(queue, n);
    vex::vector<double> ivals(queue, n);

    vex::vector<int>    okey1;
    vex::vector<long>   okey2;
    vex::vector<double> ovals;

    VEX_FUNCTION(equal, bool(int, long, int, long),
            "return (prm1 == prm3) && (prm2 == prm4);"
            );

    VEX_FUNCTION(plus, double(double, double),
            "return prm1 + prm2;"
            );

    int unique_keys = vex::reduce_by_key(
            std::tie(ikey1, ikey2), ivals,
            std::tie(okey1, okey2), ovals,
            equal, plus
            );

    assert(okey1.size() == unique_keys);
    assert(okey2.size() == unique_keys);
    assert(ovals.size() == unique_keys);