Fala Matheus, tudo bem? Espero que sim!
Vamos lá.
1 - Criamos um contexto com o propósito de reunir em um só lugar funções, objetos, variáveis, etc... que fazem parte daquele contexto, ao criar o contexto nós podemos juntar além dessas validações, algumas outras funções que fazem sentido nesse contexto, sendo assim importamos apenas o contexto e podemos receber de forma fácil essas outras lógicas, caso contrário, precisaríamos criar um arquivo para uma delas. Com o contexto podemos também compartilhar estado entre componentes, algo que não é possível fazer desacoplando em um arquivo externo.
2 - Um provider pode ser necessário para por exemplo prover um estado de um componente para outros (o que frequentemente acontece) coisa que não é possível fazer direto no contexto.
Espero ter ajudado, abraços e bons estudos :D