Add Producer.retry

This implementation allows API consumers the choice of retry strategy without being overly burdensome.

Resolves #1046.
I dig this nested assign. Reminiscent of two-step initialization in memoizing/fixpoint combinators. Makes me wonder if this could similarly be (usefully) abstracted into a separate pattern, but that’s certainly orthogonal to this PR :+1: