Pipelined mutual exclusion and the design of an asynchronous microprocessor