Rework preconditions
 * Break things up into more classes
 * ETags are now specifically base64-encoded byte arrays