Можешь объяснить разницу между ковариантностью (`out`) и контравариантностью (`in`) в Kotlin generics и как они контролируют, используются ли параметры типов для чтения или записи значений? — ДейлиПреп