Optimizing Return Distributions with Distributional Dynamic Programming