1. The 202 error log should look similar to this:
http://imgur.com/fvRV13P - in particular, it should be returning a 500 HTTP status code indicating failure. If yours is failing silently and not returning 500, there's clearly a bug somewhere along the line.
There's no need for a specific exception to spawn; the 500 error will indicate automatically to the task queue infrastructure to retry the task.
2. Yes, that shouldn't be an issue. It's unusual that it's failing like that - I've written much more data to logging than that, and it hasn't failed for me. Perhaps the logging exception isn't the real issue here, and it's masking some App Engine internal issue. Can you try removing the call to logging, or add in a short sleep timer between the cursor access and the log call?
I'm curious to see if another heap space exception pops even when the logging call is removed - this shouldn't be happening.
3. As I read more and more of this, I feel like the real issue is that you're hitting App Engine internal rate limits and throttling. On the surface, your application design seems very straightforward and correct, but you're hitting odd exceptions that App Engine should easily scale through. If you have a support contract with Google, you can call them up and ask them to relax the throttles - if not, then I would start adding sleep commands at high-throughput parts of your code, and check if that helps.
4. There are some other threads in this forum about GCS that go into more detail, but you've essentially hit the right point - internally, the urlfetch connection to GCS seems to be doing something odd (not clearing the buffers, etc). I have no idea what the actual issue is since it appears to be internal to App Engine. The problem only manifests itself if you're streaming large amounts of data to Cloud Storage though, so it doesn't affect many apps.
The only way to "fix" it is to allocate new urlfetches periodically, especially if you run into strange errors like yours.