Abstract away use of HABTM macro

By having the `:has_and_belongs_to_many` macro in the `@collection`
we are punishing `:has_many` associations because it has to allocate
the array and check the macro.

@collection is returned to `macro == :has_many` and a new reflection
class `HABTMReflection` is created to handle this case instead.
Merge pull request #15595 from eileencodes/abstract-away-habtm-macro

Abstract away use of HABTM macro