Support leftJoin against a store in offline platform

Adds support for performing a leftJoin against a store in the offline platform. Currently supports two cases:
1. sumByKey(store) is not dependent on the leftJoin
2. sumByKey(store) has a limited dependency on the leftJoin - only legal nodes between the join and store are [map | filter | flatMap]Values, i.e. we cannot have any key fanout

Based off of @johnynek's PR: https://github.com/twitter/summingbird/pull/551

can we add another case where it is a leftJoin but not a valid loop join and give a better error? Right now it will be a match error.

So:
```scala
case ljp @ LeftJoinedProducer(left, StoreService(store)) =>
  sys.error("Unsupported Join against store: not a valid loop join. If the store depends on join output, only the values can change (filterValues, mapValues, flatMapValues).")
```