This is going to be fairly tricky to do for two motors, as you have to watch two encoder channels per motor. Not impossible, but a lot of really careful coding to be sure you don't miss any transitions of either channel of the encoder on either motor (ie, you have 4 things to watch for events, and while there's correlation between the channels there's none between the motors). There would be some temptation to give each motor its own microcontroller or use a quadrature counter chip to capture the feedback (or make your own in a cheap CPLD).
Since you want to be able to turn precise angles presumably by differential rotation of the two wheels, I'd consider making a pair of position controllers rather than a speed controllers, each of which would rotate its motor to equalize the counts achieved to the counts in a desired position register. To simplify things, your primary command interface could be a signed number (of at least 16 bits, but probably 24 or even 32) to be added to the desired position each controller is seeking.
At a higher level, you would then have a motion planner, which would periodically use this to update the desired positions. When moving at a fixed velocity, you just issue a command for another n steps every m milliseconds, when speeding up or slowing down you toss in fewer. To turn you send a positive number to one and a less positive (or for on the spot, negative) to the other. Conceptually this is the same regardless if your communicating between logical blocks in a program on one processor, or commanding slave processors.