Collator Refactor

Moved the code in Collator::Compare which compared sort keys into a static Compare method which Collator::Compare now calls internally.  The addition of this method not only better separates functionality, but also makes the GetSortKey public method useful to external consumers.  While previously sort keys could be retrieved, nothing immediately useful could be done with them.  Now they can be fed into the Compare static method to compare them, which allows for sort key caching.
Catch (Unit Testing Framework)

Added a dependency on Catch -- a C++ header-only unit testing framework by philsquared (see updated README.md for more information).

As Catch is a dependency, and not part of this repository, added an entry to ignore its header to .gitignore.

Some of the options I was passing to GCC were breaking Catch, specifically -fno-elide-constructors, which was causing a link time failure.  Accordingly this option is no longer specified in the Makefile.  Also removed a define for DEBUG since that's not currently used in this project, and just happened to be in the Makefile template I reused from another project.

Catch was introducing a #define of IN, which was breaking the LineBreak enumeration.  Added preprocessor guards to fix this.
Comparer Explicit Constructor

Added explicit qualifications to the constructors of the Comparer class.
ReadMe Overhaul/Update

Overhauled README.md.  It now contains much better/more up-to-date information.
CaseConverter Fix

SpecialCasing.txt specifies:

IMPORTANT-when iota-subscript (0345) is uppercased or titlecased, the result will be incorrect unless the iota-subscript is moved to the end of any sequence of combining marks. Otherwise, the accents will go on the capital iota.  This process can be achieved by first transforming the text to NFC before casing.  E.g. <alpha><iota_subscript><acute> is uppercased to <ALPHA><acute><IOTA>

The CaseConverter class was not doing this.

In the process of adding the check and conditional normalization before uppercasing, cleaned up some of the CaseConverter code by switching custom written searching loops to use std::find_if, and by changing manual conversions of std::vector iterators to pointer typed iterators to use the templates unicode/vector.hpp provides for exactly this purpose.
String::Size

Added a Size method to the String class, which returns the number of code points in the string.
Normalizer Fix

When normalizing to NFC and faced with a chain of combining marks which could successively combine with the same starter to create successive composed characters the Normalizer class was generating incorrect output.

For example in:

GREEK SMALL LETTER ALPHA
COMBINING ACUTE ACCENT
COMBINING GREEK YPOGEGRAMMENI

The GREEK SMALL LETTER ALPHA and COMBINING ACUTE ACCENT compose to form GREEK SMALL LETTER ALPHA WITH TONOS.  This then composes with COMBINING GREEK YPOGEGRAMMENI to form GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI.

In this instance the Normalizer class was erroneously generating the output:

GREEK SMALL LETTER ALPHA WITH YPOGEGRAMMENI

As the Normalizer loops over a string trying to find compositions, it is managing two sequences of code points:

1. The input sequence
2. The output sequence

As an optimization, the Normalizer only creates a new std::vector of CodePoints if a composition must be made.  A large number of input strings do not require composition, and therefore for a large number of strings the creation of a new std::vector can be avoided, increasing speed and decreasing memory requirements.

However, after making a composition and creating a new std::vector of CodePoints including the composition, the Normalizer was still referring to starters in the old std::vector when looking up compositions.  This had no effect when many different starters were variously replaced with compositions, since each starter was only composed once, however when many combining marks attached to the same starter composed, this had the effect of causing the earlier compositions to be discarded.

For example: In the example given above, the Normalizer would see GREEK SMALL LETTER ALPHA and COMBINING ACUTE ACCENT, and combine them into GREEK SMALL LETTER ALPHA WITH TONOS.  Then the Normalizer would see COMBINING GREEK YPOGEGRAMMENI, but would look at the starter in the input sequence, which would be GREEK SMALL LETTER ALPHA.  It would then overwrite the GREEK SMALL LETTER ALPHA WITH TONOS with GREEK SMALL LETTER ALPHA WITH YPOGEGRAMMENI, acting as if the COMBINING ACUTE ACCENT had never been in the input sequence at all.