Можешь объяснить, как работает `lazy` делегат в Kotlin, включая то, когда происходит инициализация, как кешируется значение и какие у него характеристики потокобезопасности? — ДейлиПреп