Closures in programming: What are they and how do they work?