What is the purpose of the volatile keyword in C, and in what scenarios must an embedded engineer use it?