The sort of circuit you want with discrete BJTs is something like this:

Note PNP for top-side drivers, diode bridge to stop inductive spikes burning things out,
driver stage transistors to allow 2-wire control and increase current gain. The values
of R5 and R6 are selected according to the supply voltage, load and gain of the transistors
to put them into saturation for desired loads.
With good transistors (ie modern super-beta devices) you can get saturation losses of 0.1V
or so for small motors (compared to ~2V for a darlington H-bridges like the L293/L298D),
meaning higher currents can be countenanced without heatsinking.