Charging at 0.25C is sensible, keeps the current down (small components, less heat etc..) but I fear it will take a while. Given losses, you're look at 4-5 hours for constant current , and another 1-2h for constant voltage. The bulk charge will be constant current, which will charge it to around 70-75% of full charge. The constant voltage charge provides the rest. I have seen chargers for multiple cell batteries that skip the constant voltage part though, I have only ever designed chargers for single cells.
Also, your ACS712 measures current, so why would you remove that if you were only using constant current? (unless you already have a constant current supply without a limit on output voltage?).
The current limiter schematic you posted would be fine. You can calculate the value of the resistor R = ~0.7V / I. So for 2A, 0.35R. It will dissipate I^2*R watts, which is 4*0.35 = 1.4W of power. This however, will not limit voltage, but with a 15V supply, and a max charge voltage (for 3 cells) of 12.6, that leaves 2.4V drop. the resistor will drop 0.6-0.7V, the transistor will drop its Vce, so, for 2 AMP that could be up to a volt. Leaving ~2.4 - 1.6V - 0.8V drop left. Might be safe enough. Your micro will have to accurately measure the voltage across each cell and turn on its corresponding shunt transistor, the voltage limit is really just in case things go wrong.
It is fairly straight forward to make a CC/CV supply, just a regulated voltage with current limiting. Or a constant current regulator with voltage limiting. It is preferable to have the former, as the charge current only determines charge time, and cannot harm the battery as long as it is a sensible value. But voltage limit should be 4.2V/cell (assuming its a polymer battery).
You will need analogue to do the bulk of the work. Whilst a microcontroller can measure voltages, turn things on and off, and provide PWM for analogue control, it
shouldn't be used as the only way to control things in a feedback loop. What if your micro resets? or there's a brown out? or the oscillator stops? In the case of using a current monitor to your micro's ADC, and using PWM to control the charge current, then should the micro 'freeze' or there is an undefined software state, all of a sudden you could be charging your batteries at a much higher current.
As MrAl said - I will repeat almost his exact words!: best to let the analogue handle the limits, voltages and currents, and have the micro just 'monitor' things (measuring voltage of each cell, charging current, and displaying results). Of course the micro can turn things on and off, and be used to control the balancing, but be aware that things can go wrong with this approach and destroy a cell (therefore, the whole pack).
Using an micro with an ADC rather than a comparator, *can* be more accurate (assuming the comparator uses crap resistors, and the ADC has a good reference) but the digital approach requires you to actively read the voltage and do something about it. An analogue comparator is 'automatic', passive, and 'dumb'. This is why so much analogue still exists in safety-critical applications - unless the basic components fail, they will do just one job, but do it well, forever.
Also notice the 'hobbyking' charger only has two 2.2 ohm power resistors. As it charges 3 cells, you only need to shunt two of them, once those two batteries are shunted, the circuit just see's one battery with two series resistors. The last battery to be charged doesn't need shunting, because then you would have just 3 resistors in series - wasting power, not charging anything.
Although I don't really want to see the software, I would be interested in the algorithm you're using, if you have a flow chart, or just basic psuedo-code
Couple of links for cell balancing:
http://www.zajic.cz/omezovac/omezovac.htm
across each battery:
http://www.zajic.cz/omezovac/omez sch.jpg
Note that charging at 2A, the transistor/resistor across each cell will have to dissipate 4.2x2 = 8.4(!!) watts. I guess that is where your algorithm comes in, occasionally shunting a battery that has a higher voltage to bring it back in line, so no cell is being shunted for a long time.