use delegate instead of event implementation in internal MessageReceiveLoop class