The Origin of Concurrent Programming: From Semaphores to Remote Procedure Calls