implements unique algorithm

I went through a code base using Boost.Range v2 and looked up for `unique`. Here two examples which are basically a combination of `sort` + `unique` + `erase`/`erase_remove_if`:

```c++
/// Case A:
unique(sort(remove_erase_if(container, predicate)));

/// Case B:
template <class Points, class LessThan = point_less, class Equal = point_equal>
void remove_duplicate_points(Points& points, LessThan less = LessThan{}, Equal eq = Equal{}) 
{ erase(points, unique<return_found_end>(sort(points, less), equal)); }
```

Both cases can be written without chaining but I find that the chaining saves some boilerplate making the code more concise.