Piense en un módulo como un lugar para conectar una serie de otras cosas, como directivas, servicios, constantes, etc. Los módulos se pueden inyectar en otros módulos, lo que le brinda un alto nivel de reutilización.
Al escribir una aplicación angular, tendría un módulo de nivel superior que es el código de su aplicación (sin plantillas).
Los servicios son principalmente una forma de comunicarse entre los controladores, pero puede inyectar un servicio en otro. Los servicios se utilizan a menudo como una forma de llegar a sus almacenes de datos y las personas ajustarán las API angulares, como ngResource. Esta técnica es útil, ya que hace que las pruebas (especialmente las burlas) sean bastante fáciles. Puede tener servicios para hacer otras cosas como autenticación, registro, etc.
Las directivas se utilizan para crear widgets o envolver cosas existentes como complementos jquery. Ajustar los complementos existentes puede ser un desafío y la razón por la que lo haría es establecer un enlace de datos bidireccional entre los complementos y angular. Si no necesita un enlace de datos bidireccional, no necesita ajustarlos.
Una directiva también es un lugar para manipular DOM, capturar eventos DOM, etc. No debe hacer cosas relacionadas con DOM en controladores o servicios. Crear directivas puede volverse bastante complejo. En mi humilde opinión, recomiendo primero buscar en la API algo que pueda hacer lo que estás buscando O pedirle consejo al Grupo de Google de Angular.