This patch implements tile and fuse transformation for ops that
implement the tiling interface. To do so,
- TilingInterface needs a new method that generates a tiled implementation of the operation based on the tile of the result needed.
- A pattern is added that replaces a tensor.extract_slice whose source is defined by an operation that implements the TilingInterface with a tiled implementation that produces the extracted slice in-place (using the method added to TilingInterface).
- A pattern is added that takes a sequence of operations that implement the TilingInterface (for now LinalgOps), tiles the consumer, and greedily fuses its producers iteratively.