Heap.Tail was overflowing the stack with large numbers of items

I have also added some FsCheck tests to check basic heap operations using List as a reference implementation to ensure my change hadn't broken anything.