I would like to understand what an Azure Availability Set is and how it helps improve the reliability and availability of virtual machines in cloud environments. How does it protect applications from hardware failures, maintenance events, or unexpected downtime? Additionally, what are the roles of fault domains and update domains within an Availability Set, and how do they contribute to ensuring high availability and better fault tolerance for applications?