refactorings for less GC information callbacks

These are most of the changes I had in mind in https://github.com/D-Programming-Language/druntime/pull/864.
One important change is that IMO if someone is calling destroy explicitely, he also takes responsibility to call GC.free if necessary.

What could be done, too, is to make TypeInfo storage a task of the GC. It might also be possible to combine rt_finalize_array2/rt_finalize_struct, if the stored typeinfo for an array is not the TypeInfo_Struct, but TypeInfo_Array.
Wouldn't it be better for performance if this was moved after the loop and performs these 2 checks only once for the entire array, rather than for every element? Even assuming the comparisons are free and perfectly predicted, it would still be faster to zero the entire array at once rather than one element at a time.