How does Node.js handle asynchronous operations, and what are the differences between callbacks, promises, and async/await? Can you explain the event loop in Node.js and how it affects performance, especially when dealing with I/O-bound tasks? What is the purpose of middleware in Express.js, and can you provide an example of how you would create and use custom middleware in an application?