fix dumb deadlock by executing events in goroutines

also split up event/reply locks since they don't need to block each
other.