Microarchitectural Attacks: From the Basics to Arbitrary Read and Write Primitives without any Software Bugs