Audio delay using discrete components
One common method is to use a circuit know as a bucket brigade.

These circuits consist of a chain of capacitors. Connecting the capacitors are switches. By driving the control signal for the switches the signal is transferred from one capacitor to the next each time the control (or clock) signal transitions. The time delay you can achieve is limited by the number of stages you have and the slowest sampling rate you can tolerate.

Because you need many stages to create a longer delay it is not really practical to implement this with discrete components. There are a few ICs that implement the function varying from 512 to 4096 stages. With 4096 stages a 20kHz sampling rate will give you 100 ms of delay. You could cascade a number of delay lines together, but you will be losing signal quality with each section.

If signal quality and the length of the delay is important, then digital sampling techniques will be very hard to pass up.