shared/gatt-client: Add service iterator functions.

This patch introduces high-level structures and functions for iterating through,
and storing, data about the discovered services.
shared/gatt-client: Implement characteristic discovery.

This patch implements characteristic discovery as part of the client
initialization flow. The characteristics of each service are discovered in
order.
shared/gatt-client: Implement descriptor discovery.

This patch implements characteristic descriptor discovery as part of the client
initialization flow.