Remove unnecessary inline reduction name prefixing.

We ended up handling bounds for multiple instances of one func differently.
Instead of making copies during bounds inference, each stage tracks a map
from consumers to boxes, and merges the appropriate ones depending on which
consumers are in scope when it's time to lay down some bounds inference code.
Made the profiler accept parallel schedules

... but not profile inside of the parallel loops

Even if every stage is parallelized, this makes it still useful for
profiling at the top level. E.g. which compute_root stages take the longest.
Improvements to extern bounds inference

Compute_at can now be different from store_at for extern stages

Added two new intrinsics to simplify things
- Call::null_handle represents a null pointer
- Call::address_of wraps a Load node and evaluates to its address
    (i.e. similar to & in C)

These new intrinsics are used to provide the appropriate host pointer for
create_buffer_t, which now expects any Handle as the first arg.