Scalable techniques for analysing and testing asynchronous software systems