Concurrent Computing: from Petri Nets to Graph Grammars