Building Reusable Concurrent Software Systems