(PUP-2906) Reimplement Collection without 3x AST

Since collection currently relies on the on the 3x AST, it is blocking the removal of the old AST for Puppet 4. Reimplement collection so that it does not rely on the old AST. Also use this as an opportunity to improve the way collection is implemented so that is more readable and consistent.