(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. 
I think this is the only method that should be public in this class - all of the others could be made protected