Reverted commit b639eac: I'm going to handle this differently.
Revert "Modified combine operations to take user data.": I'm going to handle this differently.

This reverts commit 2db4ac6793fcd0615a9814d9269f0a0cbed0d7c9.
Refactored byte stream operations.

Library byte stream operations were growing out of control. They're now
organised as follows:

Walks
=====
Walk operations walk the stream, possibly modifying each byte as they go.
They're handled by the bs_walk function:

BSresult bs_walk(
	BS *bs,
	BSbyte (*operation) (BSbyte byte)
);

Library methods (as before):
 - bs_walk_uppercase
 - bs_walk_lowercase
 - bs_walk_not

Combinations
============
Combinations apply an operand to the current byte-stream, modifying it. The
lengths of the streams may differ: the operand will be duplicated / truncated
to fit. They're handled by the bs_combine function:

BSresult bs_combine(
	BS *bs1,
	const BS *bs2,
	BSbyte (*operation) (BSbyte byte1, BSbyte byte2)
);

Library methods (as before):
 - bs_combine_xor
 - bs_combine_or
 - bs_combine_and
 - bs_combine_add
 - bs_combine_sub

Accumulations
=============
These accumulate the bytes of a stream into a result (probably a scalar value,
but there's no restriction. The underlying stream is not modified. These are
handled with bs_accumulate:

BSresult bs_accumulate(
	const BS *bs,
	BSbyte (*operation) (BSbyte byte, void *data),
	void *data
);

Library methods:
 - bs_accumulate_sum
 - bs_accumulate_bits

Comparisons
===========
Finally we may compare two byte streams. Comparisons only really work on streams
of equal length, but this doesn't restrict them. They're handled with
bs_compare:

BSresult bs_compare(
	const BS *bs1,
	const BS *bs2,
	BSbyte (*operation) (BSbyte byte1, BSbyte byte2, void *data),
	void *data
);

Library methods:
 - bs_compare_equal, which returns in the return value in a slightly hacky way
 - bs_compare_hamming (as before)
Added test cases for comparison methods.
Added test cases for accumulator methods, fixed bug in bs_accumulator_bits.