Parse the smart heap in debug mode.

Summary: This adds a HeaderKind enum, updates initializers to initialize
the kind byte, and adds a HeapIter class to parse the whole heap.

Refactored the constructors for ArrayData, ObjectData, and ResourceData
to store the initial kind and count using a single store.

FreeList::push() adds a second store because we have to initialize the
next pointer and kind/size fields, which are in different words. Once we
have a contiguous heap, we can initialize a free block with one store,
by compressing the next pointer.

Reviewed By: @jdelong

Differential Revision: D1655037