What are the core design principles of Node.js, and how does the event loop handle asynchronous operations?