Foundations of Algorithmic Fairness