StringLookup / tf.lookup resource cleanup on model cleared
Moved from https://github.com/keras-team/tf-keras/issues/136

Here is relevant solution that seems to stop problem:

```python
def wipeit(model):
    def _give_handles(m):
        if hasattr(m, 'resource_handle'):
            yield m.resource_handle
    
        children =  {}
        try:
            children = m._trackable_children()
        except:
            pass

        for child in children.values():
            yield from _give_handles(child)


    for handle in _give_handles(model):
        tf.raw_ops.DestroyResourceOp(resource=handle)


...

# during model load, after its loaded
prev_model = loaded_model
loaded_model = tf.saved_model.load(...)

if prev_model:
    wipeit(prev_model)
    del prev_model
```
 @sachinprasadhs,
I was able to reproduce the issue on tensorflow v2.13, v2.12 and tf-nightly. Kindly find the gist of it [here](https://colab.research.google.com/gist/tilakrayal/90480a04fd76ea1d0968fe7b9bde09f3/untitled1367.ipynb).
### Issue type

Bug

### Have you reproduced the bug with TensorFlow Nightly?

Yes

### Source

binary

### TensorFlow version

2.12

### Custom code

Yes

### OS platform and distribution

Linux Ubuntu 22.04

### Mobile device

_No response_

### Python version

3.10

### Bazel version

_No response_

### GCC/compiler version

_No response_

### CUDA/cuDNN version

_No response_

### GPU model and memory

_No response_

### Current behavior?

Describe the problem.

Define a simple network with a StringLookup of non-trivial size

Reload the network in a for loop.

Memory goes to infinity.

Describe the current behavior.
Memory goes up every load

Describe the expected behavior.
Memory doesn't go up every load

When using StringLookup: 

![image](https://user-images.githubusercontent.com/4107771/267815955-966e2a02-135a-4e68-a185-c49120e90092.png)

When using Hashing it works:

![image](https://github.com/tensorflow/tensorflow/assets/4107771/2145a1d1-1eaf-4595-808c-8f53a8a6616f)


### Standalone code to reproduce the issue

```shell
import time
import os

import tensorflow as tf
import psutil

def model_fn():
    X = tf.keras.Input(shape=(1,), dtype=tf.string)
    lookup = tf.keras.layers.StringLookup(
        vocabulary=tf.constant([str(x) for x in range(100_000)])
    )(X)
    Y = tf.math.reduce_sum(lookup, axis=1)

    return tf.keras.Model(inputs=[X], outputs=[Y])

model = model_fn()
model.save("/tmp/test-model")

loaded_model = None

process = psutil.Process()

def get_current_mem():
    return process.memory_info().rss / 1e6

def load():
    global loaded_model
    loaded_model = tf.saved_model.load("/tmp/test-model")

print('==========================================================')
print("starting process...")

for i in range(100_000):
    start_mem = get_current_mem()
    start = time.time()

    print(f"i={i} loading...", end='')
    load()

    curr_mem = get_current_mem()
    end = time.time()
    print(f"done (mem_usage={curr_mem - start_mem}mb took={int(end - start)}s)")
    time.sleep(0.25)
```


### Relevant log output

_No response_