Exploiting Asynchrony For Performance And Fault Tolerance In Distributed Graph Processing