Issue 6989 - create a better string representation of Tid

Original discussion here: https://github.com/D-Programming-Language/phobos/pull/1582

The basic premise is that we will let Tid's expose the Thread that is receiving messages, without actually exposing the MessageBox itself.  There exists a short window after spawn()/spawnLinked() where Tid.receiveThread is null (the thread hasn't yet set it in _spawn()).

I am very new to the Phobos codebase, my apologies if I am grossly breaking the process.  Two areas I know this change is weak and needs help:
- Tid.toString() should be changed to not allocate.
- A proper unit test.  I've got a quick tester program below that seems to work for me.

```D
import core.thread;
import std.concurrency;
import std.stdio;

void spawnTest(int threadNum) {
    stdout.writefln("%d Thread.toHash(): 0x%x Tid: %s", threadNum, Thread.getThis.toHash(), thisTid);
}

void main(string [] args) {
    stdout.writefln("Current thread: 0x%x", Thread.getThis.toHash());
    Thread [] threads;
    for (auto i = 0; i < 100; i++) {
	auto child = spawn(&spawnTest, i);
	stdout.writefln("[main] Tid: %s", child);
	while (child.receiveThread is null) {
	    Thread.sleep(dur!("msecs")(1));
	}
	threads ~= child.receiveThread;
    }
    foreach (t; threads) {
	t.join(false);
    }
    stdout.writeln("Done");
}
```

Don't use this overload if you want to avoid the GC; use this instead:
````
void toString(scope void delegate(const(char)[]) sink)
````
Instead of constructing a string, use `sink.put(...)` to append data to the output. If you're using `formattedWrite`, you can pass `sink` in place of the writer.