Pense em um módulo como um local para conectar várias outras coisas, como diretivas, serviços, constantes etc. Os módulos podem ser injetados em outros módulos, proporcionando um alto nível de reutilização.
Ao escrever um aplicativo angular, você teria um módulo de nível superior, que é o código do seu aplicativo (sem modelos).
Os serviços são principalmente uma maneira de se comunicar entre controladores, mas você pode injetar um serviço em outro. Os serviços costumam ser usados como uma maneira de acessar seus repositórios de dados e as pessoas agrupam as APIs angulares, como ngResource. Essa técnica é útil, pois facilita bastante o teste (principalmente a zombaria). Você pode ter serviços para fazer outras coisas, como autenticação, log etc.
As diretivas são usadas para criar widgets ou agrupar coisas existentes, como plugins jquery. O agrupamento de plug-ins existentes pode ser um desafio, e o motivo para você fazer isso é estabelecer uma ligação de dados bidirecional entre os plug-ins e o angular. Se você não precisar de ligação de dados bidirecional, não precisará agrupá-los.
Uma diretiva também é um local para a manipulação do DOM, captura de eventos do DOM, etc. Você não deve fazer coisas relacionadas ao DOM nos controladores ou serviços. Criar diretivas pode ficar bastante complexo. IMHO, recomendo primeiro procurar na API algo que possa fazer o que você está procurando OU pedir conselhos ao Grupo do Google da Angular.