Optimization to StdReader::Find

Let the stream do the hard work within the API so that we don't have to
keep re-constructing sentry objects / bounds checking.

Average instructions for profiler application reduced by ~65% (7730 ->
2752).

This is a good test because the 3 CSV files have different
charactersitics (the ints have only a few characters to search while the
strings can runs to 100s of chars)

BEFORE:
     CSV<int, std::string, Path>::LoadCSV(BinaryReader)/BinaryReader::Find(unsigned char) const : 48345892 / 2137 (22623)
 --> CSV<int, long>::LoadCSV(BinaryReader)/BinaryReader::Find(unsigned char) const : 1579036 / 2138 (738)
     CSV<int, int, int, long>::LoadCSV(BinaryReader)/BinaryReader::Find(unsigned char) const : 3167360 / 2593 (1221)

AFTER:

 --> CSV<int, std::string, Path>::LoadCSV(BinaryReader)/BinaryReader::Find(unsigned char) const : 16336606 / 2183 (7483)
     CSV<int, long>::LoadCSV(BinaryReader)/BinaryReader::Find(unsigned char) const : 1152530 / 2184 (527)
     CSV<int, int, int, long>::LoadCSV(BinaryReader)/BinaryReader::Find(unsigned char) const : 1805733 / 2643 (683)