Towards Practical Fault-Tolerant Quantum Computing