What is declarative and imperative programming? What are the pros and cons of using each?