refactored the attack method- pulled out some code and created the
destroy and destroyOffScreenUnit methods, also accounts for units
carrying other units (if a carrior gets destroyed, so will the carried
units)

Also changed the convoyedUnits method to (potentially) return an empty
set or a partially empty set if some units are nil