What happens if I send a ping to a host that is off? Do I get an ICMP message with "host unreachable"? Does ICMP say nothing at all because the packet was correctly delivered even though it was not processed by the destination host? I don't know how ICMP reacts in these cases.
ICMP doesn't do anything because there is no host to generate ICMP messages back to the source.
The ping application will time out. I think most implementations have a default two-second timeout, but you can probably override that. An implementation of ping is going to have the features that the author of that tool version built in.
With a local ping, the ARP request times out, no ICMP echo request is actually sent.
With a remote ping across one or more routers, the last router (failing local ARP) might return an ICMP error.