(TK-18) Improve implementation of `service` macro

This commit changes the implementation of the `service` macro so
that rather than building up the prismatic graph of functions
first and then reifying the service instances as wrappers around
the graph, we instead reify the service instances first and build
the prismatic graph functions as wrappers around the protocol
instances.  This makes the services look and feel much more
like "normal" protocol reifications; it should alleviate some
of the strange compilation errors that we'd occasionally get
when trying to call functions from the `Service` protocol, etc.

The only API change is to remove the `service-constructor` function
from the `ServiceDefinition` protocol, which shouldn't have many
external implications since this function was an internal implementation
detail.
I'm not sure whether I actually can do this, because all that `instantiate` is doing is calling the prismatic graph function, with some error handling wrapped around it to make for a better user error message.

In other words, the function I'm calling there is not our function, I don't control the source for it, so I can't control the return value.

I'd love to get rid of this atom but I'm not sure I see a way to do it.  Also I believe that it should go out of scope as soon as we get out of the build-app* function, so I'm slightly less concerned about it than I would normally be with an atom.

If you see a way to modify `instantiate` that would allow me to get rid of it I'd be happy to change it.