Changes:
* Change the casting code to be const correct.  Now, doing this is invalid:
     const Value *V = ...;
     Instruction *I = dyn_cast<Instruction>(V);
  instead, the second line should be:
     const Instruction *I = dyn_cast<Instruction>(V);

* Change the casting code to allow casting a reference value thus:
     const Value &V = ...;
     Instruction &I = cast<Instruction>(V);

  dyn_cast does not work with references, because it must return a null pointer
  on failure.

* Fundamentally change how instructions and other values are represented.
  Before, every llvm container was an instance of the ValueHolder template,
  instantiated for each container type.  This ValueHolder was effectively a
  wrapper around a vector of pointers to the sub-objects.

  Now, instead of having a vector to pointers of objects, the objects are
  maintained in a doubly linked list of values (ie each Instruction now has
  Next & Previous fields).  The containers are now instances of ilist (intrusive
  linked list class), which use the next and previous fields to chain them
  together.  The advantage of this implementation is that iterators can be
  formed directly from pointers to the LLVM value, and invalidation is much
  easier to handle.

* As part of the above change, dereferencing an iterator (for example:
  BasicBlock::iterator) now produces a reference to the underlying type (same
  example: Instruction&) instead of a pointer to the underlying object.  This
  makes it much easier to write nested loops that iterator over things, changing
  this:

    for (Function::iterator BI = Func->begin(); BI != Func->end(); ++BI)
      for (BasicBlock::iterator II = (*BI)->begin(); II != (*BI)->end(); ++II)
        (*II)->dump();

  into:

    for (Function::iterator BI = Func->begin(); BI != Func->end(); ++BI)
      for (BasicBlock::iterator II = BI->begin(); II != BI->end(); ++II)
        II->dump();

  which is much more natural and what users expect.

* Simplification of #include's: Before, it was necessary for a .cpp file to
  include every .h file that it used.  Now things are batched a little bit more
  to make it easier to use.  Specifically, the include graph now includes these
  edges:
    Module.h -> Function.h, GlobalVariable.h
    Function.h -> BasicBlock.h, Argument.h
    BasicBlock.h -> Instruction.h

  Which means that #including Function.h is usually sufficient for getting the
  lower level #includes.

* Printing out a Value* has now changed: Printing a Value* will soon print out
  the address of the value instead of the contents of the Value.  To print out
  the contents, you must convert it to a reference with (for example)
  'cout << *I' instead of 'cout << I;'.  This conversion is not yet complete,
  but will be eventually.  In the mean time, both forms print out the contents.

* References are used much more throughout the code base.  In general, if a
  pointer is known to never be null, it is passed in as a reference instead of a
  pointer.  For example, the instruction visitor class uses references instead
  of pointers, and that Pass subclasses now all receive references to Values
  instead of pointers, because they may never be null.

* The Function class now has helper functions for accessing the Arguments list.
  Instead of having to go through getArgumentList for simple things like
  iterator over the arguments, now the a*() methods can be used to access them.

