Closes #362 - Make API data objects immutable

In my experience w/ performance testing in Java, need to account for JIT and GC.  

For JIT I usually run test multiple times, ignoring 1st few runs (because those my have been interpreting and compiling byte codes).  The rational is that we want to see post JIT performance because we are dealing w/ long lived processes.  Also do not want to compare non-JIT to JIT, either want to compare JIT to JIT or non-JIT to non-JIT.

For GC you can force GC between test runs and maybe wait a bit.   Otherwise object allocations in test run N can cause GC in test run N+1.    I think the call to `System.gc()` is async, which is why I recommended sleeping.  Also, in older JVMs calling it multiple times would cause more aggressive collection.  Not sure about 1.7.