Closes #362 - Make API data objects immutable

See 619df3c92d8d35 & 88b79a5045661 - I could not use Supplier as it only provides `Bytes get()` method and I need `Bytes get(byte[] data)` so I created a new interface.  I also tried to use static initialization block to create factory but the block doesn't run if you call `Bytes.wrap()` and I got a NPE so I moved the creation of BytesFactory to a synchronized method.