reworked message passing between instances

probably introduced a race: will need to make Wait() wait
for communicate() to return