implements unique algorithm

I've been following this guideline: if an algorithm returns an iterator into a range, the range should be taken by non-const lvalue. So the range overload should have this signature:

    I operator()(Rng & rng, R pred = R{}, P proj = P{}) const

That means those algorithms can't take rvalue ranges. That's correctly, because otherwise they would be returning iterators into dead ranges. There are cases where it would be safe -- e.g. if the range in an `iterator_range` -- but I'm favoring a simple, conservative rule for now, and will change it later if the committee objects.