RemoveWhere improvement

It is better to call RemoveExtracted here, since there may be linear
probing enabled.
Fix for RemoveWhere
Extended functionality

Added method to allow to iterate over removed items. The idea of this is
to allow disposal of weak needles. Sadly allowing to iterate over the
removed items on a call to Clear means that the bucket cannot be
recycled, since I can't make sure the client will recycle the bucket I
have opted to make the new Clear methods internal.
Extended functionality (more of the same)

Since the removals are per value, sometimes it is necessary to pass an
item that compares as equal to the one that is intended to remove. When
that happens the removed object is not the same as the passed object.
If a WeakNeedle is found dead, it is freed.
Taking advantage of recent changes

Note: I have a few more fixes to do...
Extra fixes 1
Extra fixes 2

SpecialNeedle Removed. WeakNeedle.Allocate is no longer virtual.
PromiseNeedle internals are new marked as serlializable.
Fixed ToString format in PromiseNeedle.
Other annotations.
Extra fixes 3

It is very common for me to have a ManualResetEvent in a class I don't
want to be disposable. I must look for a solution to that.
Extra fixes 4 (clean up, style and readability)
PromiseNeedle<T> moved to new a file
Another fix for RemoveWhere...

I may modify these methods again because the GC Runner thread is taking
"forever" to remove dead needles.
Class WeakSet has renamed to WeakSetBucket

This was pending for a while, I had forgot about it.
Fix for the infinite loop in RemoveWhere...

The culprit was the check for the items didn't allow to skip empty
slots.

This is a great improvement, but it still has problems. More control is
needed:
- Still more than expected objects
- Still (sometimes) running out of memory