Why does everyone, including Atmel, put brackets around C shift expressions such as:
TCCR0A = (3<<COM0A0) | (3<<COM0B0) | (3<<WGM00);
Unless I've misread it the C spec clearly states that the shift operators take priority over the bitwise logical operators, so it's only necessary, and clearer, to write:
TCCR0A = 3<<COM0A0 | 3<<COM0B0 | 3<<WGM00;