The discrete dipole approximation: an overview and recent developments