Add compile-time integer type helpers

This adds code from the Boost library integer.h (but not the entire
file), modified to compile on AVR. In particular, it enables types like
uint_t<24>::least to get an unsigned integer type at least 24 bits in
size, or int_t<16>::exact to get a signed integer type exactly 16 bits
in size (the latter causes compilation failure when no such type is
available).
Emulate static_assert when C++11 is not enabled

This copies static_assert.h from library-gainspan-s2w to emulate
static_assert for compile time assertions even when C++11 is not enabled
(which provides a builtin static_assert declaration).
Add code to fully parse backpack EEPROM contents

Also adds the backpack.resources bitlash command that displays all
resources:

> backpack.resources(0)
wifi.spi: spi, ss = 15, max speed = 2.88Mhz
wifi.pgm: gpio, pin = 14
wifi.power: pin = 19, minimum = 0.00uA, typical = 72.00uA, maximum = 320.00uA
sd.spi: spi, ss = 16, max speed = 26.00Mhz
sd.power: pin = 17, minimum = 0.00uA, typical = 0.00uA, maximum = 72.00uA
eep.spi: spi, ss = 7, max speed = 54.00Mhz
eep.power: pin = 17, minimum = 0.00uA, typical = 0.00uA, maximum = 0.00uA
Move UNIQUE_ID_* constants into PBBP.h

They were previously in PBBP-Protocol.h, but that one is only included
in PBBP.cpp. Moving these constants allows using them from other files
as well.
Assert that the length of Pbbe::UniqueId is correct
Replace CRC implementations with template versions

This allows using the same code for 8-bit and 16-bit CRCs. This also
moves the function definitions to the header files and removes crc.cpp,
because they are now templates.

This removes the pinoccio_crc_generate_byte and
pinoccio_crc_generate_word functions in favour of a single
pinoccio_crc_generate function, requiring updating any external callers
(wifi test jig). The implementation of this function is also changed to
use pinoccio_crc_update instead of duplicating that code.
Add Pbbe::UniqueIdChecksum() and Pbbe::eepromChecksum()
Let Backpacks::detect() return a bool
Update comments in endian_integer.h
Fix indent
Move RGB hex parsing into PinoccioShell

This generalizes the parsing so it can be reused. It also now supports
both uppercase and lowercase digits and errors out on invalid digits.
Add detailed error message to EEPROM parsing (disabled by default)

Can be enabled by defining DETAIL_PARSE_ERRORS in Pbbe.cpp.
Validate EEPROM checksum after reading it
Support updating (part of) a backpack EEPROM

e.g., to replace the entire wifi backpack eeprom:

> backpack.eeprom.update(0, "01403b000000000000000001776966e904776966e9010f7c030e7067ed051339cae10473e40110a905110000cb046565f00107c2051105809e")

Or to update just the wifi SPI speed at offset 0x17:

> backpack.eeprom.update(0, 0x17, "7c")

Either form will automatically update the checksum and, if needed, the
length eeprom length byte.
Convert EEPROM physical pin numbers to logical pins

Also, allow looking up the proper names for each pins and print those in
the backpack.resources output.
In backpack.resources, print "unknown" instead of 0