Why use a stepper motor controller?
Drivers like L293D and ULN2803 are just transistors in a box. there's no reason you couldn't cook up an equivalent from discrete parts.

8 MMBTA14, 8 resistors, and 8 diodes gets you a ULN2803 work-alike with more power, but the ULN2803 is cheaper and more compact.

If you want to get fancy with stepper motors - run several at the same time, di microstepping, or run several in tight synchronisation The problem is timing. stepper motors need precise timing for smooth operation.

a raspberry pi running Linux, or Windows mobile, or Risc-os, doesn't give guaranteed timing to user-space processes so, trying to run a stepper smoothly is not practical.

If you were to replace the OS with bare-bones code, then yeah it could do stepper motor tricks, but probably not do video or ethernet at the same time. 

so to get fancy with stepper motos the best path is to use a stepper motor controller - this couldbe software running on an arduino, or a purpose bult board with drivers on it too.