Add French snowball stemmer to tokenization pipeline: - Index both original tokens AND their stems in InvertedIndex - Query terms are also stemmed before lookup - Stemmed forms accumulate TF from all original forms - Lazy-init singleton pattern for stemmer