Adiabatic Quantum Computation and Quantum Annealing: Theory and Practice