[PoC][orders] Unified way to process payments

The PR adds three interface `MoneyInteface`, `CurrencyInterface` and `OrderInterface` and basic implementations for all of them. 

The main idea is to establish a protocol (the `OrderInterface`) which must be supported by all payments. As soon as you reuse `OrderInterface` you dont have to worry about payment specific details. It would be really easy to change one payment extension by another.

This will work inside you favorite framework (**symfony2, zend2, laravel, yii** you name it) out of the box.

## Capture

```php
<?php
use Payum\Core\Model\Order;
use Payum\Core\Model\Money;
use Payum\Core\Model\Currency;
use Payum\Core\Request\Capture;
use Payum\Paypal\ExpressCheckout\Nvp\PaymentFactory as PaypalExpressPaymentFactory;
use Payum\Paypal\ExpressCheckout\Nvp\Api;

$oneDollar = new Money(100, new Currency('USD'));

$order = new Order;
$order->setNumber(uniqid());
$order->setTotalPrice($oneDollar);

$payment = PaypalExpressPaymentFactory::create(new Api(array(
   'username'  => 'change it',
   'password'  => 'change it',
   'signature' => 'change it',
   'sandbox'   => true,
)));

if ($reply = $payment->execute(new Capture($order), true)) {
    if ($reply instanceof HttpRedirect) {
        header("Location: ".$reply->getUrl());
        die();
    }

    throw new \LogicException('Unsupported reply', null, $reply);
}
```

## Get status

```php
<?php
use Payum\Core\Request\GetHumanStatus;

$oneDollar = new Money(100, new Currency('USD'));

$order = new Order;
$order->setNumber(uniqid());
$order->setTotalPrice($oneDollar);

$payment = PaypalExpressPaymentFactory::create(new Api(array(
   'username'  => 'change it',
   'password'  => 'change it',
   'signature' => 'change it',
   'sandbox'   => true,
)));

$payment->execute($status = new GetHumanStatus($order));
 
if ($status->isCaptured()) {
   // captured!!!
} else {
    echo $status->getValue();
}
```

## Get Details 

```php
<?php
$payment->execute(new Authorize($order));

$payment->execute(new Refund($order));

$payment->execute(new Cancel($order));
```

## Customizations

There is a possibility to customize payment specific details:

```php
<?php
use Payum\Core\Model\Order;
use Payum\Core\Model\Money;
use Payum\Core\Model\Currency;
use Payum\Paypal\ExpressCheckout\Nvp\Api;

$oneDollar = new Money(100, new Currency('USD'));

$order = new Order;
$order->setNumber(uniqid());
$order->setTotalPrice($oneDollar);
$order->setDetails(
    'NOSHIPPING' = Api::NOSHIPPING_NOT_DISPLAY_ADDRESS,
    'REQCONFIRMSHIPPING' => Api::REQCONFIRMSHIPPING_NOT_REQUIRED,
    'L_PAYMENTREQUEST_0_ITEMCATEGORY0' =>   Api::PAYMENTREQUEST_ITERMCATEGORY_DIGITAL,
    'L_PAYMENTREQUEST_0_AMT0' => 1,
    'L_PAYMENTREQUEST_0_QTY0' => 1,
    'L_PAYMENTREQUEST_0_NAME0' => 'The Mysterious Island. Jules Verne',
    'L_PAYMENTREQUEST_0_DESC0' => 'The Mysterious Island is a novel by Jules Verne, published in 1874.',
);

// do capture
```


Alrighty, I've always been weary of the `?:` shorthand in this case, i'll take your word for it :+1: