YCP AST: Replace CompilerContext#{drop,keep}_whitespace

Replace CompilerContext#{drop,keep}_whitespace with a more generic
method. This is needed because we'll have more values than :drop and
:keep soon.
YCP AST: Rework CompilerContext#whitespace

Instead of a simple :keep/:drop flag, CompilerContext#whitespace became
a tuple of 4 boolean values specifying which whitespace should be
dropped in detail. This will be used later to remove e.g. whitespace
above the first/below the last statement of a function.
YCP AST: Centralize compiling when whitespace is kept

All statement sequences that we want to compile with whitespace kept are
now compiled using a single function. This will allow us to tweak the
behavior at one place.
Remove whitespace before the first/after the last statement

This prevents some ugly empty lines.