Dictionary Learning: Principles, Algorithms, Guarantees