Learning End-to-End Channel Coding with Diffusion Models