Marshal a Haskell string into a NUL terminated C string using temporary storage.
the Haskell string may not contain any NUL characters
the memory is freed when the subcomputation terminates (either normally or via an exception), so the pointer to the temporary storage must not be used after this.