Ops can implement this interface to specify lower/upper bounds for their result values and block arguments. Bounds can be specified for:

- Index-type values
- Dimension sizes of shapes values

The bounds are added to a constraint set. Users can query this constraint set to compute bounds wrt. to a user-specified set of values. Only EQ bounds are supported at the moment.

A helper function is added to the Affine dialect to reify a computed bounds with an `affine.apply` op.

This revision also contains interface implementations for various tensor dialect ops, which illustrates how to implement this interface.

Depends On: D146869