Verifying Distributed, Event-Based Middleware Applications Using Domain-Specific Software Model Checking