refactor(net:message) add NetMessage interface

* Design Goal: reduce coupling
* NB: Slices hold references to an underlying array, and if you assign
  one slice to another, both refer to the same array. If a function
  takes a slice argument, changes it makes to the elements of the slice
  will be visible to the caller, analogous to passing a pointer to the
  underlying array.