Control structures in programming languages: from goto to algebraic effects