communicating sequential processes — formal language for concurrent systems