firmware-test: Generalize the testing code a bit

This reduces code duplication and at the same time improves the output
of the testing process.
firmware-test: Automatically introduce parity errors

Instead of just testing a parity error in a single, fixed placed, now
parity errors are introduced in different stages in the protocol
automaticallly.
firmware-test: Prevent array out of bounds indexing

It shouldn't happen, but just in case the status code somehow ends up
invalid, don't use it to index the error_code_str array.
firmware-test: Test more (random) values

Previously, each testcase would use fixed values (e.g., addresses). Now,
when multiple options are available (e.g., multiple invalid addresses or
invalid commands), a random one is picked instead. This helps to uncover
bugs that only occur with specific values (some previously fixes bugs
were only triggered when the parity bit had a specific value, for
example).
firmware: Move the unique ID to position 1 in the EEPROM

This makes room for the layout version in position 0 and conforms to the
EEPROM layout specification.
firmware: Fix indent of protocol.h
firmware-test: Check no slave responds to unassigned addresses
firmware: Pull the line low as quickly as possible

This reduces the chance that the line will go high again before the
slave gets a chance to pull it low.
firmware-test: Don't print a random value when reading failed
firmware-test: Introduce lengthof macro
firmware-test: Also test using minimum and maximum timings
firmware-test: Allow changing inter-bit time

Previously, only the idle time _after_ a bit was configurable. However,
when also doing serial printing in between, sometimes the maximum
inter-bit time would be exceeded. By explicitely checking for this time,
we can test the limits on it.
firmware: Prevent triggering INT0 when the slave pulls the line low

Normally, the line is pulled low before the slave releases the line.
However, the protocol does not require this, so when the master is using
minimal timings, it could happen that the line is high before the slave
pulls it low. In this case, we should prevent triggering INT0 a second
time.
firmware-test: Print expected status on errors
firmware-test: Verify the slave properly times out
firmware-test: Seed the random generator