[NEEDS REVIEW] Refactor Postmaster unsolicited check

**Todo before merge**
- [x] confirm working with phone example 
- [ ] confirm logic to determine unsolicited checks out with Tessel team
- [ ] remove logs

**Overview**
I found the unsolicited check to be very, very confusing to follow. This is the beginning of my attempt to refactor it.

The line in question is: 

```
if ((self.callback === null || (!self.started && starts.indexOf(data) === -1)) && !(!self.started && self.alternate && self.alternate[2] && self.alternate[0].filter(function(partialStart) {
        if (self.debug) {
          console.log([data], [partialStart], data.indexOf(partialStart));
        }
        return data.indexOf(partialStart) === -1;
      }).length != self.alternate[0].length)) {
      //  ^check that we're not using soft logic either...
      self.emit('unsolicited', data); 
}
```

First I factored out various checks into single functions. Then I combine these functions in a function that returns true/ false. 

```
function isUnsolicited() {
      if(!hasCallback()) {
        return true;
      }
      if(!hasStarted() && !useSoftContains && !isDataInStartArrayStrict()) {
        return true;
      }
      if(!hasStarted() && useSoftContains && !isDataInStartArraySoft()) {
        return true;
      }
      return false;
}
```

The initial logic was very confusing, but I think I've captured the essence. There is a lot of logging that I will remove once I'm sure the logic is correct. @johnnyman727 can you take a look and confirm the logic is correct? 


I touch on this in my first comment, but to elaborate there are multiple possible states here. Listed in order of strictness:

1. The expected start exactly matches the start of the packet
2. The expected start is in the packet (and ideally is the header, not just somewhere in the body)
3. The packet is contained in the expected start (currently included in the implementation of `softContains`)
4. No match, soft or otherwise.

#3 is unnecessary if we're careful with our starts/enders and might get us into trouble when handling arbitrary text.