A class that handles argument lifting. Argument lifting is needed in the following scenarios:
eta expansion
applications with default arguments
applications with out-of-order named arguments Lifting generally lifts impure expressions only, except in the case of possible default arguments, where we lift also complex pure expressions, since in that case arguments can be duplicated as arguments to default argument methods.