Add Producer.retry

This implementation allows API consumers the choice of retry strategy without being overly burdensome.

Resolves #1046.
:+1: