Sebastian Korda battled past Alexander Zverev in three sets to reach the semi-finals of the Canadian Open.