From Finite To Infinite: Scalable Automatic Verification Of Hardware Designs And Distributed Protocols