Macro annotation to remove Product / Serializable

... and to show the consequences. The desugaring of case classes
doesn't work anymore as `hashCode` and `toString` are defined in
terms of `Product`.

See also my recent fix for SI-8631 (https://github.com/scala/scala/commit/ad9d87b1faad22c1a2e05351757c0a940e2a0ef2) which removes one nasty
consequence of `Product` / `Serializable` leaking into LUBs.

```
[info] Compiling 1 Scala source to /Users/jason/code/sbt-example-paradise/core/target/scala-2.11/classes...
[error] /Users/jason/code/sbt-example-paradise/core/src/main/scala/Test.scala:1: type mismatch;
[error]  found   : Casey
[error]  required: Product
[error] @slimCase
[error]  ^
[error] /Users/jason/code/sbt-example-paradise/core/src/main/scala/Test.scala:5: type mismatch;
[error]  found   : Casey
[error]  required: Product
[error]   def foo(t: Casey): Product = t
[error]                                ^
[[syntax trees at end of                     typer]] // Test.scala
package <empty> {
  case class Casey extends AnyRef {
    def <init>(): Casey = {
      Casey.super.<init>();
      ()
    };
    <synthetic> def copy(): Casey = new Casey();
    <synthetic> def productPrefix: String = "Casey";
    <synthetic> def productArity: Int = 0;
    <synthetic> def productElement(x$1: Int): Any = x$1 match {
      case _ => throw new IndexOutOfBoundsException(x$1.toString())
    };
    <synthetic> def productIterator: Iterator[Any] = runtime.this.ScalaRunTime.typedProductIterator[Any](<Casey: error>.this);
    <synthetic> def canEqual(x$1: Any): Boolean = x$1.$isInstanceOf[Casey]();
    override <synthetic> def hashCode(): Int = ScalaRunTime.this._hashCode(<Casey: error>.this);
    override <synthetic> def toString(): String = ScalaRunTime.this._toString(<Casey: error>.this);
    override <synthetic> def equals(x$1: Any): Boolean = x$1 match {
  case (_: Casey) => true
  case _ => false
}.&&(x$1.asInstanceOf[Casey].canEqual(Casey.this))
  };
  <synthetic> object Casey extends scala.runtime.AbstractFunction0[Casey] {
    def <init>(): Casey.type = {
      Casey.super.<init>();
      ()
    };
    final override <synthetic> def toString(): String = "Casey";
    case <synthetic> def apply(): Casey = new Casey();
    case <synthetic> def unapply(x$0: Casey): Boolean = if (x$0.==(null))
      false
    else
      true
  };
  object Test extends AnyRef with App {
    def <init>(): Test.type = {
      Test.super.<init>();
      ()
    };
    def foo(t: Casey): Product = <t: error>
  }
}
```