fix Issue 11403 - functions in std.algo can't be used as pred

Very similar to what I did in #1676 for  `canFind`, `any` and `all`: It allows declaring them with only a a predicate but not with the argument type. Effectively, this allows using with a specified pred, *as* a pred. EG: `equal!(equal!approxEqual)`.

So now, `equal` is a template. (BTW, I *highly* recommend looking at this with `w=1`: https://github.com/D-Programming-Language/phobos/pull/1819/files?w=1 : This pull involves basically indenting all of equal's implementation).

Furthermore, I removed the "non-pred" overload as:
a) Its presence made things more complicated.
b) It was counter productive to other functions that use `a == b` as a predicate.

If you had reviewed #1676, there should be no surprises here.