add optional reply() callback. Closes #95