A dual perspective on separable semidefinite programming with applications to optimal downlink beamforming