An Event-driven Architecture for MPI Libraries