Exploiting structure for scalable software verification