Crash application if memory is corrupted

This pull request throws exception when we detect the memory is potentially corrupted. The verification is enabled through compiler flag HEAP_VERIFICATION.

Running ProtoTest gets a bunch of memory exceptions. So of them probably is false positive, need to investigate them. 

@lukechurch, @junmendoza please review the change. 
Yes, these exceptions happen pretty common...you may sync to my branch and enable this compilation flag, and run some proto tests, for example ProtoFFITests, and you'll see a list of exceptions.

But probably some of them are false positive. For example, now I check in DecRefCounter() that reference counter should >= 1, but probably in some cases we need to release temporary object which hasn't been assigned to any variable so that its reference count remains 0. We can do further analysis based on test result and decide if these exceptions are false positive or not.