Verifying Local Transformations of Concurrent Programs