Make use of flocking.
Flocking combines three steering behaviours, separation, cohesion and alignment.
The idea is that through the combination of these behaviours, more complex, fairly realistic behaviour is created (this is called emergent behaviour).
Each agent has a neighbourhood data structure. The neighbourhood can be a simple bounding sphere test to check for the nearest neighbouring agents. Using this data, the 3 behaviours perform certain actions:
Separation (Ensure that agents don't get too close together)
Steer the agent away from the neighbouring agents
This behaviour iterates through the neighbouring agents, normalizes the vector to the neighbour and divides by the distance to the neighbour. This is then added to the steering force you apply to the agent.
Alignment (Used to make sure agents are facing the right direction)
Steer the agent towards the average heading of neighbouring agents
This behaviour iterates through the neighbouring agents, calculating the average heading of the neighbours and adds the vector to this average heading to the steering force of the agent.
Cohesion (Used to group agents together)
Steer the agent towards the centre of mass of neighbouring agents
This behaviour is similar to alignment, but instead of the calculating the average heading, we calculate the average position of the neighbours. Then we add the vector to the centre of mass to the agent's steering force.
Or... just make use of a library like OpenSteer.
I'd highly recommend you get Mat Buckland's Programming Game AI by Example. It will answer a lot of questions you have about steering behaviours and provides easy to understand source code.
EDIT:
If you look at OpenSteer and Buckland's book, you will notice that steering behaviours are atomic behaviours. Each behaviour is given some sort of weighting/priority value and the effects of all active behaviours are summed together.
So, to work with pathfinding, a path-follow behaviour is also a type of steering behaviour. This means that path-follow and flocking can be weighted, thus combining the effects of both.
Honestly, though, break it down into very small chunks, before you get caught up in integrating components with other components.