UTF8Encoding.GetMaxByteCount() was returning too big number.

The thing is, unlike the standards describe in codepoints, .NET String
characters beyond BMP are represented as surrogate pairs and they can be
converted all in 3 bytes.

The implementation didn't take care of encoder fallbacks, or byte order
marks either, so take them into considertion too.