Asyncprogress

Rebased and fixed. Replaces #175 and #181. Closes #169.
I think the documentation should make it very clear that you can only call this function from inside your Execute() method.  It's not immediately obvious from looking at the code.