ggml-metal: implement async 2D tensor copy functions
Add ggml_metal_set_tensor_2d_async and ggml_metal_get_tensor_2d_async
functions to the Metal backend, mirroring the CUDA implementation.
These functions use MTLBlitCommandEncoder's 2D copy API to efficiently
copy tensor data with different strides between host and device memory,
enabling row-strided transfers without requiring contiguous layouts.
Assisted-by: llama.cpp:local pi