Coupling Fairness and Pruning in a Single Run: a Bi-level Optimization Perspective