add `compare` module with comparators

Take two. The heap code will follow later.
This is an abuse of the trait and operator overloading, but you could do something hacky like:

```rust
impl<'a, Sized? C, Sized? Lhs, Sized? Rhs> PartialOrd<(&'a Lhs, &'a Rhs)> for C
    where C: Compare<Lhs, Rhs> { ... }
```
And then use it as
```rust
let cmp = ...
let lhs = ...
let rhs = ...
if cmp < (lhs, rhs) { ... }
```
It almost looks like a method named `<`.