Normalize identifiers to NFKC
Normalize identifiers to NFKC

This patch adds normalization of all identifier-like tokens to
Unicode Normalization Form KC. This means all identifiers, implicit
symbols, and type suffixes will be normalized. Everything else is left
as is, namely character literals, raw and cooked strings, explicit
symbols, and documentation comments are unaffected and are interpreted
exactly as in the source.

Normalization Form KC helps to avoid ambiguous spellings of identifiers,
though it also affects the way identifiers are interpreted, which may be
not obvious to some people. However, I believe that this is for greater
good. Unicode is hard and not using any normalization at all leaves
a way for security issues. Read Unicode Techical Report #36 for more.

As for the reason why NFKC is chosen over other forms, I believe that
folding ambiguities is a must, so NFC is not an option, and we need
a compact representation, so there is no specifc reason to choose NFKD.

This adds tests which verify that identifiers are normalized to NFKC.
They are carefully crafted to break if any other normalization form is
used or normalization is removed entirely. Though, other tests will
also break in this case :) They had to be fixed to accomodate the
changes.

ilammy/sash