String.Length failure and slow match indexing

Internal calls to String.Length have been replaced with
StringInfo.LengthInTextElements to accurately reflect the number of
Unicode code points in the String.

Capture.Index is now calculated by rolling up previous indices as they
are found so that conversion between char* offsets and Unicode code
point indices only happens once.

A custom UTF-16 -> UTF-8 function has been added. Currently it is as
fast as the built-in .NET equivalent, with a smaller memory footprint.
In the future it can be optimized to improve Re2.Net's performance on
.NET string inputs.