Add binary_find algorithm

Added ```binary_find``` algorithm and changed ```upper_bound```, ```lower_bound```, ```binary_search``` to use it as its core. This will also be useful in ```partition_point``` as well.

This also calls for a small change in my proposal. During the week I have allocated to improve ```binary_search```, I will instead improve ```binary_find``` to take advantage of the partitioned input(Currently it simply uses ```find_if```)