Req constr

This PR adds a notion of multicommodity requests, an optional mass-based request constraint, and a richer coverter interface.

RequestPortfolios can now be explicitly informed of mutually acceptable requests, and a default constraint can be added such that a combination of those requests will satisfy the same demand. For example,
```
  RequestPortfolio<Material>::Ptr rp(new RequestPortfolio<Material>());
  Request<Material>::Ptr uox = rp->AddRequest(/* uox args */);
  Request<Material>::Ptr mox = rp->AddRequest(/* mox args*/);

  std::vector<Request<Material>::Ptr> mutuals;
  mutuals.push_back(uox);
  mutuals.push_back(mox);
  rp->AddMutualReqs(mutuals);

  rp->AddDefaultConstraint();
```

As a result of implementing the default constraint, the Converter interface was updated. Previously, Converters were only aware of the offer resource object; they are now aware of the offer, the arc associated with the offer, and the full exchange context.