Tuple improvements (specifically: opCmp)

3 parts:

1. Made the interfaces auto ref. We really shouldn't be making copies when we can pass by ref.

2. Improved the implementation of opCmp:

Fixes: It is not actually legal to call a user defined type's `opEqual` (`!=`) when testing user-defined inequality. The "legal" code should be:

```D
if (lhs < rhs)
    return -1;
if (lhs > rhs) //NOT "if (rhs < lhs)": This could call a different function
    return 1;
return 0;
```

However, implementing `opCmp` in terms of `<` is *very* ineficient, especially when lhs and rhs have opCmp already... So I improved the runtime by calling opCmp directly when possible.

3. Improved opCmp unittests.

This verifies that: 1) Tuples of different types can be compared (eg Tuple!int vs Tuple!short) and 2) Makes sure you get the correct run-time result.