Use a fake io.Reader as null byte source instead of slice

Saves allocating several megabytes at a time for each test.
Add simple benchmark to the test suite
Move MD4 hashing into goroutines

MD4 hashing is implemented in pure Go, which ends up making CPU the
bottleneck when hashing lots of data. Hash each chunk in a different
goroutine.

Benchmarks indicate a small performance loss when GOMAXPROCS is 1
(default), but performance improves almost linearly with the amount of
CPUs enabled.

The hashing state data was all moved inside the hashLoop() function.
Adding hashes and requesting the current hash list is done through
channels (and channels of channels). The ordering of the data is ensured
by putting each hash result in its own channel, and putting the channels
in a queue.
Set runtime.GOMAXPROCS in ed2ksum

Takes advantage of the concurrency-enabling changes.