Correctly handle empty response bodies in Thrift

The thrift representation of an empty array is the same as null, so when the body is empty (such as with a HeadSync), the current implementation of Execute will throw an exception because MemoryStream cannot handle nulls. Instead return an empty byte array. Also add integration test for this case.