O lateinit apenas diz que uma val nao nula vai ser inicializada em algum momento. Já o provider funciona como uma inicializacao lazy.
manualmente tu consegue controlar qual tu esta instanciando primeiro mas nem sempre tu consegue ou sabe qual vai ser instanciado primeiro (como ao usar uma lib de DI)