text: Title: Use `casefold`, not `lower`, when comparing strings case-insensitively
  Body: We currently use [str.lower()](https://docs.python.org/3/library/stdtypes.html#str.lower). when comparing strings case-insensitively, but it would be better to use [str.casefold()](https://docs.python.org/3/library/stdtypes.html#str.casefold). From the documentation of the latter:
  
  > Casefolding is similar to lowercasing but more aggressive because it is intended to remove all case distinctions in a string. For example, the German lowercase letter 'ß' is equivalent to "ss". Since it is already lowercase, [lower()](https://docs.python.org/3/library/stdtypes.html#str.lower) would do nothing to 'ß'; [casefold()](https://docs.python.org/3/library/stdtypes.html#str.casefold) converts it to "ss".
  
  There aren't too many cases where the difference between `lower` and `casefold` matters, but there's no performance difference between them either and the change is trivial. This change should be done at least to our `normalize()` utility that is used internally in various places both directly and indirectly. Should also change keywords in BuiltIn that support case-insensitivity the same way.