Support for arbitrary tensor sizes in `tfl.strided_slice` lowering
@jpienaar @eric-k256 Just pinging on this PR. Thanks! Hi @jpienaar Can you please review this PR ? Thank you! Hi @rsuderman Can you please review this PR ? Thank you! Hi @jpienaar Can you please review this PR ? Thank you! Hi @jpienaar Can you please review this PR ? Thank you! Hi @jpienaar Can you please review this PR ? Thank you! Hi @jpienaar Can you please review this PR ? Thank you! Hi @jpienaar Can you please review this PR ? Thank you! Hi @jpienaar Can you please review this PR ? Thank you! Hi @jpienaar Can you please review this PR ? Thank you!
The existing lowering strategy for `tfl.stided_slice` does not account for the possibility that the input tensor size may not be an exact multiple of the stride in a particular dimension. This patch addresses this situation by inserting padding to the original tensor with an additional `tosa.pad` op in order to make all sizes exact multiples of the strides.

For example:

```
%0 = "tfl.pseudo_const"() {value = dense<[0, 0, 1]> : tensor<3xi32>} : () -> tensor<3xi32>
%1 = "tfl.pseudo_const"() {value = dense<[1, 1000, 4]> : tensor<3xi32>} : () -> tensor<3xi32>
%2 = "tfl.pseudo_const"() {value = dense<[1, 1, 4]> : tensor<3xi32>} : () -> tensor<3xi32>
%result = "tfl.strided_slice"(%arg0, %0, %1, %2) {begin_mask = 0 : i32, ellipsis_mask = 0 : i32, end_mask = 0 : i32, new_axis_mask = 0 : i32, shrink_axis_mask = 0 : i32, offset = false} : (tensor<1x1000x4xf32>, tensor<3xi32>, tensor<3xi32>, tensor<3xi32>) -> tensor<1x1000x1xf32>
```

This code was previously producing an error in the `tosa-legalize-tfl` pass. Now it is successfully converted to the following TOSA code:

```
%0 = "tosa.const"() <{value = dense<[[0, 0], [0, 0], [0, 1]]> : tensor<3x2xi64>}> : () -> tensor<3x2xi64>
%1 = "tosa.const"() <{value = dense<0.000000e+00> : tensor<f32>}> : () -> tensor<f32>
%2 = "tosa.slice"(%arg0) <{size = array<i64: 1, 1000, 3>, start = array<i64: 0, 0, 1>}> : (tensor<1x1000x4xf32>) -> tensor<1x1000x3xf32>
%3 = "tosa.pad"(%2, %0, %1) : (tensor<1x1000x3xf32>, tensor<3x2xi64>, tensor<f32>) -> tensor<1x1000x4xf32>
%4 = "tosa.reshape"(%3) <{new_shape = array<i64: 1, 1000, 1, 4>}> : (tensor<1x1000x4xf32>) -> tensor<1x1000x1x4xf32>
%5 = "tosa.slice"(%4) <{size = array<i64: 1, 1000, 1, 1>, start = array<i64: 0, 0, 0, 0>}> : (tensor<1x1000x1x4xf32>) -> tensor<1x1000x1x1xf32>
%result = "tosa.reshape"(%5) <{new_shape = array<i64: 1, 1000, 1>}> : (tensor<1x1000x1x1xf32>) -> tensor<1x1000x1xf32>
```

