[metal] Initial bring up of Metal HAL driver (1/n) (#3045)

This commit starts a Metal HAL driver. It registers the Metal HAL
driver and implements the following functionalities:

* All hal::Driver APIs
* hal::Device APIs for creating queues/buffers/semaphores
  and waiting on semaphores
* All hal::CommandQueue APIs
* All hal::Semaphore APIs
* hal::CommandBuffer APIs for lifetime

All other APIs will return unimplemented error for now.

hal/cts/ tests are enhanced to cover hal::Driver APIs and
more semaphore wait APIs. Existing hal/cts/ tests are all passing,
except allocator_test, which is not yet implemented at the moment.
diff --git a/docs/get_started/getting_started_macos_cmake.md b/docs/get_started/getting_started_macos_cmake.md
index 7b916cd..b71284a 100644
--- a/docs/get_started/getting_started_macos_cmake.md
+++ b/docs/get_started/getting_started_macos_cmake.md
@@ -110,9 +110,11 @@
 ### Further Reading
 
 *   For an introduction to IREE's project structure and developer tools, see
-    [Developer Overview](../developing_iree/developer_overview.md) <!-- TODO:
+    [Developer Overview](../developing_iree/developer_overview.md).
+*   To understand how IREE implements HAL over Metal, see
+    [Metal HAL Driver](../design_docs/metal_hal_driver.md).
+<!-- TODO:
     Link to macOS versions of these guides once they are developed.
-*   To target GPUs using Vulkan, see
-    [Getting Started on Linux with Vulkan](getting_started_linux_vulkan.md)
 *   To use IREE's Python bindings, see
-    [Getting Started with Python](getting_started_python.md) -->
+    [Getting Started with Python](getting_started_python.md)
+-->